[英]All records from first table and extra records from second table
我有 2 个表,我想从第一个表中获取所有记录,并从第二个表中获取额外记录。
表 A
+-----+---------+---------+
| ID | NAME | TASK |
+-----+---------+---------+
| 101 | Alan | Prepare |
+-----+---------+---------+
| 102 | Fabien | Approve |
+-----+---------+---------+
| 103 | Christy | Plan |
+-----+---------+---------+
| 104 | David | Approve |
+-----+---------+---------+
| 105 | Eric | Set |
+-----+---------+---------+
表 B
+-----+---------+---------+
| ID | NAME | TASK |
+-----+---------+---------+
| 101 | Richy | Prepare |
+-----+---------+---------+
| 103 | Girish | Plan |
+-----+---------+---------+
| 106 | Fleming | Approve |
+-----+---------+---------+
| 107 | Ian | Set |
+-----+---------+---------+
预期 output
+-----+---------+---------+
| ID | NAME | TASK |
+-----+---------+---------+
| 101 | Alan | Prepare |
+-----+---------+---------+
| 102 | Fabien | Approve |
+-----+---------+---------+
| 103 | Christy | Plan |
+-----+---------+---------+
| 104 | David | Approve |
+-----+---------+---------+
| 105 | Eric | Set |
+-----+---------+---------+
| 106 | Fleming | Approve |
+-----+---------+---------+
| 107 | Ian | Set |
+-----+---------+---------+
我试过使用LEFT JOIN
。 但我只从左表得到所有。
select * from A left join B on A.ID=B.ID and B.ID is NULL
我也尝试过UNION
和UNION ALL
但由于 2 个表中的Name
可能不同,我得到了两条记录。 一种解决方案可能是使用NOT IN
,但这对我来说很大,因为我在这里将大查询称为表 A 和 B。 我不知道我错过了什么。 它应该很简单,但现在我并不感到惊讶。 请帮忙。
我正在考虑在ROW_NUMBER
和计算列的帮助下建立联合:
WITH cte AS (
SELECT ID, NAME, TASK, 1 AS SRC FROM TableA
UNION ALL
SELECT ID, NAME, TASK, 2 FROM TableB
),
cte2 AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY SRC) rn
FROM cte
)
SELECT ID, NAME, TASK
FROM cte2
WHERE rn = 1;
这里的想法是构建一个包含两个表中所有记录的中间表。 我们引入了一个计算列来跟踪表源,并赋予 A 记录比 B 记录更高的优先级。 使用ROW_NUMBER
允许我们 select A 记录超过 B 具有相同ID
的记录。
Full outer join
将起作用,因为全外连接将从两个表中获取所有匹配和不匹配的记录
;with tablea as
(
select 101 as id, 'Alan' name, 'Prepare ' as task
union select 102 , 'Fabien' , 'Approve'
union select 103 , 'Christy' , 'Plan '
union select 104 , 'David' , 'Approve '
union select 105 , 'Eric' , 'Set ')
,tableb as (
select 101 as ID ,'Richy ' as NAME ,' Prepare ' as TASK
union select 103 ,'Girish ',' Plan '
union select 106 ,'Fleming',' Approve '
union select 107 ,'Ian ',' Set '
)
select isnull(a.id,b.id) as id, isnull(a.name,b.name) as name, isnull(a.task,b.TASK) from tablea a
full outer join tableb b on a.id = b.ID
结果
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.