SQL连接2个表而不重复值

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

我有两个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   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