如何将两个表(具有相同的模式)组合成一个具有不同值的表,并指出每行来自哪个表?

时间:2013-05-08 19:53:36

标签: sql

假设我在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;

但是,上述查询将为两个表中显示的每个名称返回两行。如何编写查询以便为每个不同的名称返回一行?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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) ;