我有两张桌子:
+--------+-----+
| name | A |
+--------+-----+
| abc | 10|
| def | 17|
| ghi | 27|
+--------+-----+
+--------+-----+
| name | B |
+--------+-----+
| abc | 9 |
| def | 55|
| xyz | 92|
+--------+-----+
现在我需要将这两个表组合起来,每个名称只出现一次,但它的结果是A和B.如果没有匹配的条目,则应显示零。
所以结果应该是这样的:
+--------+-----+-----+
| name | A | B |
+--------+-----+-----+
| abc | 10| 9 |
| def | 17| 55|
| ghi | 27| 0 |
| xyz | 0 | 92|
+--------+-----+-----+
稍后我可能会有一个 C 的第三个表,应该以相同的方式添加。
SQL如何?
答案 0 :(得分:3)
您需要使用full outer join
,这将保留不在两个表上加入的行。您可以找到here有关此内容的更多详细信息。
您的查询应如下所示
select coalesce(t1.name, t2.name) name
coalesce(t1.a, 0) a,
coalesce(t2.b, 0) b
from table1 t1
full outer join
table2 t2
on t1.name = t2.name
coalesce
函数返回第一个参数,如果是null
,则返回第二个参数,这是必需的,因为如果没有连接一行,它将被{{1}保留但是你会有outer join
个。
答案 1 :(得分:0)
select names.name, a.A, b.B
from (select name from tablea
union
select name from tableb) names
left join tablea a on a.name = names.name
left join tableb b on b.name = names.name
答案 2 :(得分:0)
试试这个:
create table TableA(Name varchar(3),A int)
create table TableB(Name varchar(3),B int)
insert into TableA values('abc',10)
insert into TableA values('def',17)
insert into TableA values('ghi',27)
insert into TableB values('abc',9)
insert into TableB values('def',55)
insert into TableB values('xyz',92)
select ISNULL(TableA.Name,TableB.Name),ISNULL(A,0),ISNULL(B,0) from TableA
full outer JOIN TableB ON TableA.Name=TableB.Name
如果有两个以上的表使用' coalesce()'函数而不是ISNULL
喜欢这个,如果我们添加另一个第三个表:
create table TableC(Name varchar(3),C int)
insert into TableC values('abc',9)
insert into TableC values('def',55)
insert into Tablec values('LMN',92)
select coalesce(t1.name, t2.name,t3.name) name,
coalesce(t1.a, 0) a,
coalesce(t2.b, 0) b,
coalesce(t3.C,0) C
from TableA t1
full outer JOIN TableB t2 ON t1.Name=t2.Name
full outer JOIN TableC t3 ON t1.Name=t3.Name or t2.Name=t3.Name
答案 3 :(得分:0)
{{1}}