2017-03-18 109 views
0

我有兩個表:結合表具有不同的數據

+--------+-----+ 
| name | A | 
+--------+-----+ 
| abc | 10| 
| def | 17| 
| ghi | 27| 
+--------+-----+ 

+--------+-----+ 
| name | B | 
+--------+-----+ 
| abc | 9 | 
| def | 55| 
| xyz | 92| 
+--------+-----+ 

現在我需要這兩個表結合起來,每一個名字只出現一次,但它有一個在它的結果和B。如果沒有匹配的條目比應該顯示零。

所以結果應該是這樣的:

+--------+-----+-----+ 
| name | A | B | 
+--------+-----+-----+ 
| abc | 10| 9 | 
| def | 17| 55| 
| ghi | 27| 0 | 
| xyz | 0 | 92| 
+--------+-----+-----+ 

後來我可能有第三個表Ç應該以同樣的方式被加入。

SQL的外觀如何?

回答

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 

的​​3210函數返回第一個參數,或者,如果是null,第二,它的必要的,因爲如果行不加入,也將被保留由outer join,但你將有null秒。

+0

最佳解決方案,可以用ifnull代替coalesce – Esperento57

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 
+0

這個解決方案有點過於複雜嗎?它將在'A'和'B'上返回'null'而不是'0'而不是'left join'加入的行。 –

+0

是的,我錯過了零需求評論。這可以像使用coalesce一樣解決。但即便如此,缺席客戶業務需求,這似乎是錯誤的。如果沒有記錄存在,值不是零,它根本就不存在。空更好。我認爲可能由於誤解數據的性質而產生零需求。至於複雜性,這取決於你的解釋/看法。從概念上講,對我來說似乎更簡單。首先創建所有名稱的不同列表,然後使用它來獲取其他數據值。這代表了比完整連接更清晰的邏輯問題。 –

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 
+1

我想你甚至可以在最後一個連接'完全外部JOIN TableC t3 ON coalesce(t1.Name,t2.name)= t3.Name'中使用coalesce''' –

+0

是的......你說得對。它也有效。 – mansi

0
select abc as name,1 as a into #table1 
select ayz as name,1 as b into #table2 

SELECT 
z.name, 
isnull(#table1.A, 0), 
isnull(#table2.B, 0) 
FROM 
(SELECT name FROM #table1 
UNION 
SELECT name FROM #table2) AS Z 
left join #table1 on #table1.name = z.name 
left join #table2 on #table2.name = z.name 
相關問題