我有下面的测试表,我想选择这些表并将结果组合起来:
create table employees
(
id bigint primary key,
account_id integer,
first_name varchar(150),
last_name varchar(150),
timestamp timestamp
);
create table accounts
(
id bigint primary key,
account_name varchar(150) not null,
timestamp timestamp
);
create table short_name
(
account_id bigint primary key,
full_name varchar(150) not null
);
INSERT INTO short_name(account_id, full_name)
VALUES(1, 'city 1');
INSERT INTO short_name(account_id, full_name)
VALUES(2, 'city 2');
INSERT INTO employees(id, account_id, first_name, last_name, timestamp)
VALUES(1, 1, 'Donkey', 'Kong', '10-10-10');
INSERT INTO employees(id, account_id, first_name, last_name, timestamp)
VALUES(2, 2, 'Ray', 'Kurzweil', '11-10-10');
INSERT INTO employees(id, account_id, first_name, last_name, timestamp)
VALUES(32, 2, 'Ray2', 'Kurzweil2', '1-10-10');
INSERT INTO employees(id, account_id, first_name, last_name, timestamp)
VALUES(33, 2, 'Ray3', 'Kurzweil3', '2-10-10');
INSERT INTO employees(id, account_id, first_name, last_name, timestamp)
VALUES(3432, 3, 'Percy', 'Fawcett', '6-10-10');
INSERT INTO accounts(id, account_name, timestamp)
VALUES(1, 'DK Banana Account', '5-10-10');
INSERT INTO accounts(id, account_name, timestamp)
VALUES(2, 'Kurzweil''s invetions moneyz baby!', '10-10-10');
INSERT INTO accounts(id, account_name, timestamp)
VALUES(3, 'Amazonian Emergency Fund', '10-10-10');我试过这个:
select * from employees as e
INNER JOIN short_name as sn on sn.account_id = a.id
union
select * from accounts as a;https://www.db-fiddle.com/f/pwzwQTsHuP27UDF17eAQy4/29
如何选择表并显示按时间戳排序的合并表行?是否也可以将表的名称显示为第一个结果列?
发布于 2022-04-28 10:12:16
如评论所示,您的要求并不十分清楚。
但是,如果您执行以下操作,您似乎只想输出两个表:
select e.*, a.* from employees e, accounts a;您只需构建笛卡尔产品,这意味着您将员工的每一行与帐户中的每一行( accounts中的3行* employees中的5行= 15行)组合在一起。
现在,您的employee表中有一个account_id行,这意味着您可以在这个表上加入它,以便将每个员工都匹配为一个帐户:
select e.*, a.* from employees e, accounts a
where e.account_id=a.id;这将导致来自employee的5行,再加上与每个员工匹配的account表中的帐户信息。现在还可以添加short_name表中的信息,如下所示:
select e.*, a.*,sn.* from employees e, accounts a, short_name sn
where e.account_id=a.id
and sn.account_id=a.id;这将导致4行,因为带有account_id=3的帐户没有匹配的条目short_name。如果您想再次看到所有的5个,您必须执行一个左连接:
select e.*, a.*,sn.* from employees e, accounts a
left join short_name sn on sn.account_id=a.id
where e.account_id=a.id;现在,account_id=3缺少的字段将只是'null‘。
在这种情况下,最好将full_name列从short_name表移到accounts表,因为它与有关帐户的信息是1:1的关系。
猜测short_name表中的条目涉及城市,并且您只希望每个城市条目只需要一次,则相反:在accounts表中添加一个city_id列,并使用该列标识short_name表中的城市,从而产生n:1关系。
https://dba.stackexchange.com/questions/311191
复制相似问题