我希望比较两组数据并显示两组的完整联合,并添加列以显示行是否出现在第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或两者。
答案 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
解决方案略有不同。如果两个表中都有重复项,那么该解决方案可以将行相乘。此解决方案将删除重复项,即使在表中也是如此,因此多行将缩小到一行。