2013-06-21 89 views
0

我希望比较两组数据并显示两个集合的完全并集,并添加列以显示一行出现在集合1,集合2还是两者中。我正在使用T-SQL比较SQL表格:显示完整集合和任何差异

Table A 
|[ID] | [Movie] | [Year] | 
|-----|---------|--------| 
| 1 | Movie1 | Year1 | 
| 2 | Movie2 | Year2 | 
| 3 | Movie3 | Year3 | 

Table B 
|[ID] | [Movie] | [Year] | 
|-----|---------|--------| 
| 2 | Movie2 | Year2 | 
| 3 | Movie3 | Year3 | 
| 4 | Movie4 | Year4 | 


Desired Result: 
|[ID] | [Movie] | [Year] | [In Set A?] | [In Set B?] | 
|-----|---------|--------|-------------|-------------| 
| 1 | Movie1 | Year1 | Yes  |  No  | 
| 2 | Movie2 | Year2 | Yes  |  Yes  | 
| 3 | Movie3 | Year3 | Yes  |  Yes  | 
| 4 | Movie4 | Year4 | No  |  Yes  | 

这是可以在SQL中完成的吗?我希望添加的列只有1列,输出是A,B或两者。

+0

也有像两个表中有不同数据的相同ID的边缘情况,等等。 –

+0

你正在使用什么数据库系统? –

回答

1

您可以使用完整的JOIN和COALESCE,这是假设你可以加入对ID:

SELECT COALESCE(a.ID,b.ID)as ID 
    , COALESCE(a.Movie,b.Movie) as Movie 
    , COALESCE(a.Year,b.Year) as Year 
    , CASE WHEN a.ID IS NULL THEN 'NO' ELSE 'YES' END as InSetA 
    , CASE WHEN b.ID IS NULL THEN 'NO' ELSE 'YES' END as InSetB 
FROM TableA a 
FULL JOIN TableB b 
ON a.ID = b.ID 

演示:SQL Fiddle

你也可以合并的最后部分为一个字段:

SELECT COALESCE(a.ID,b.ID)as ID 
    , COALESCE(a.Movie,b.Movie) as Movie 
    , COALESCE(a.Year,b.Year) as Year 
    , CASE WHEN a.ID IS NULL THEN 'In B Only' 
      WHEN b.ID IS NULL THEN 'In A Only' 
      ELSE 'In Both' 
     END as InTable  
FROM TableA a 
FULL JOIN TableB b 
ON a.ID = b.ID 
1

您可以用union all做到这一点:

select id, movie, year, 
     (case when max(inA) = 1 then 'Yes' else 'No' end) as inA, 
     (case when max(inB) = 1 then 'Yes' else 'No' end) as inB 
from (select id, movie, year, 1 as InA, 0 as InB 
     from tableA 
     union all 
     select id, movie, year, 0, 1 
     from tableB 
    ) t 
group by id, movie, year 

这与full outer join解决方案略有不同。如果两个表中有重复,那么该解决方案可以将行数相乘。此解决方案将删除重复项,即使在一个表中,也会将多行缩小为一行。

+0

我喜欢这种方式,我的编辑是出现在建议中还是只是被打到位? –

+0

这很好,谢谢。我喜欢互联网......它只是帮助人们的人! – user2507320