2013-05-08 54 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) ; 
相关问题