2013-05-08 27 views
2

假設我在SQL兩個表:如何將兩個表(具有相同的模式)合併到一個具有不同值並指示每行來自哪個表的表中?

Table_Alpha Table_Bravo 
Id | Name  Id | Name 
---+------ ---+----- 
1 | Alice  1 | Charlie 
2 | Bob  2 | Bob 
3 | Charlie 3 | Dorothy 

我想這兩個表合併成一個單一的表,避免重複和跟蹤其表的每個名字從像這樣來了:

Result 
Name | Alpha | Bravo 
-------+-------+------ 
Alice | 1 | 0 
Bob | 1 | 1 
Charlie| 1 | 1 
Dorothy| 0 | 1 

我想,我想要的查詢將是這個樣子:

SELECT Name, 1 AS Alpha, 0 AS Bravo FROM Table_Alpha 
UNION 
SELECT Name, 0 AS Alpha, 1 AS Bravo FROM Table_Bravo; 

然而,上面的查詢將返回兩行對每個南e出現在兩張表中。我該如何編寫查詢,以便爲每個不同的名稱返回一行?

回答

4

這項工作?

SELECT DISTINCT Name, sum(Alpha) as 'Alpha', sum(Bravo) as 'Bravo' 
FROM (
    SELECT Name, 1 as Alpha, 0 as Bravo from Table_Alpha 
    UNION 
    SELECT Name, 0 as Alpha, 1 as Bravo from Table_Bravo 
) X 
GROUP BY Name 
+0

這符合OP的請求如果你添加「按名稱分組」。 – 2013-05-08 20:07:38

+0

@DaveJohnson - 你說得對。我已經更新了答案。謝謝 – 2013-05-08 20:08:57

+0

非常接近!我正在使用的SQL服務器要求我添加一個「GROUP BY」子句,因此我放棄了「DISTINCT」關鍵字。 – 2013-05-08 20:11:30

0

您可以使用FULL JOIN如果Name列沒有重複,沒有GROUP BY需要:

SELECT 
    COALESCE(a.Name, b.Name), 
    CASE WHEN a.Name IS NOT NULL THE 1 ELSE 0 END AS Alpha, 
    CASE WHEN b.Name IS NOT NULL THE 1 ELSE 0 END AS Bravo 
FROM 
    Table_Alpha AS a 
    FULL JOIN 
    Table_Bravo AS b 
     ON a.Name = b.Name ; 

如果有重複:

SELECT 
    COALESCE(a.Name, b.Name), 
    COUNT(a.Name) AS Alpha, 
    COUNT(b.Name) AS Bravo 
FROM 
    Table_Alpha AS a 
    FULL JOIN 
    Table_Bravo AS b 
     ON a.Name = b.Name 
GROUP BY 
    COALESCE(a.Name, b.Name) ; 
相關問題