【发布时间】:2022-01-27 14:46:33
【问题描述】:
我有 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 |
+-----+---------+---------+
预期输出
+-----+---------+---------+
| 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,但由于Name 在两个表中可能不同,我得到了两条记录。一种解决方案可能是使用NOT IN,但这对我来说很重要,因为我在这里将大查询称为表 A 和 B。我不知道我错过了什么。它应该很简单,但现在我并不感到惊讶。请帮忙。
【问题讨论】:
-
Fleming 和 Ian 在 [A] 中不存在,因此它们根本不可能出现在结果集中,因为它基于 [A]。这个连接条件
A.ID=B.ID and B.ID is NULL是逻辑废话。加入一列,然后在同一列中过滤 NULL 将不匹配 [B] 中的任何内容 - 从有效和逻辑上讲,您根本没有真正加入。您应该明确定义您的表格代表什么以及您的目标是什么。
标签: sql sql-server join sql-server-2019