SQL连接2个表而不重复值
我有两个1:n关系的表。 我希望在不重复(复制)一个表中的值的情况下连接它们 首先,我有一个预算表:SQL连接2个表而不重复值,sql,join,duplicates,repeat,Sql,Join,Duplicates,Repeat,我有两个1:n关系的表。 我希望在不重复(复制)一个表中的值的情况下连接它们 首先,我有一个预算表: id name budget 1 John 1000 2 Kim 3000 第二,我有一张支出表: id amount 1 112 1 145 1 211 结果应该如下所示: id name budget amount 1 John 1000 112 1 null null 145 1 null null
id name budget
1 John 1000
2 Kim 3000
第二,我有一张支出表:
id amount
1 112
1 145
1 211
结果应该如下所示:
id name budget amount
1 John 1000 112
1 null null 145
1 null null 211
2 Kim 3000 null
输出也可以是:(这并不重要)
这在SQL中是可能的吗
此处是重复值的联接:
create temporary table a (id1 int,name varchar(10),budget int);
insert into a (id1,name,budget) values(1,'Maier',1000),(2,'Mueller',2000);
create temporary table if not exists b (id2 int,betrag int);
insert into b (id2,betrag) values(1,100),(1,133),(1,234);
select * from a left join b
on a.id1=b.id2
;
关键字DISTINCT用于从查询结果中消除重复行:
select distinct b.id, b.name, b.budget, s.amount
from budgets b left join spendings s
on b.id = s.id;
您还可以使用GROUPBY子句,其工作方式类似于Distinct。在这种情况下
select b.id, b.name, b.budget, s.amount
from budgets b left join spendings s
on b.id = s.id
group by b.id, b.name, b.budget, s.amount;
您可能会发现在客户机中比在SQL中更容易实现这一点。输出到哪里去了?可能吗?对它在SQL中有意义吗?不完全是这样,因为您的结果依赖于顺序,但没有固有的排序方式。输出是暂时的,供程序处理。在客户机中执行此操作需要编写更多的代码。它不依赖于顺序,因为我不在乎John是在第1行、第2行还是第3行。他不是要消除重复项,而是要在输出中实现一种演示风格。
select b.id, b.name, b.budget, s.amount
from budgets b left join spendings s
on b.id = s.id
group by b.id, b.name, b.budget, s.amount;
create table a (id1 int,name varchar(10),budget int)
insert into a (id1,name,budget) values(1,'Maier',1000)
insert into a (id1,name,budget) values(2,'Mueller',2000)
create table b (id2 int,betrag int)
insert into b (id2,betrag) values(1,100)
insert into b (id2,betrag) values(1,133)
insert into b (id2,betrag) values(1,234)
insert into b (id2,betrag) values(2,300)
insert into b (id2,betrag) values(2,400)
select a.id1, CASE WHEN c.themin IS NOT NULL THEN a.name ELSE NULL END AS [name],
CASE WHEN c.themin IS NOT NULL THEN a.budget ELSE NULL END AS [budget],
b.*
from a
LEFT join b on a.id1=b.id2
LEFT OUTER JOIN (SELECT MIN(betrag) AS [themin], id2 FROM b GROUP BY id2) c ON a.id1 = c.id2 AND b.betrag = c.themin