比较SQL表:显示完整集和任何差异

时间:2013-06-21 01:54:18

标签: sql

我希望比较两组数据并显示两组的完整联合,并添加列以显示行是否出现在第1组,第2组或两者中。我在T-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或两者。

2 个答案:

答案 0 :(得分:1)

你可以使用FULL 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 :(得分: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解决方案略有不同。如果两个表中都有重复项,那么该解决方案可以将行相乘。此解决方案将删除重复项,即使在表中也是如此,因此多行将缩小到一行。

相关问题