繁体   English   中英

第一个表中的所有记录和第二个表中的额外记录

[英]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

我也尝试过UNIONUNION 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM