在SQL中的A列或B列上联接两个表

时间:2019-04-26 20:44:11

标签: sql join null

我有两个表,分别是计划表和实际表。每个表中的每一行都代表一个唯一的项目,我需要查找“计划”表中的项目,而不是“实际”表中的项目,反之亦然。

由三列唯一标识每个项目,并且这些列中的每一个的值都可以为null,也可以不为null。

例如:

说“计划”看起来像这样:

ID_1        ID_2         ID_3
aaa         Null         Null 
Null        111          Null
Null        Null         123
bbb         222          Null 
ccc         Null         456
Null        333          789
ddd         444          202

说“实际”是这样的:

ID_1         ID_2            ID_3
aaa          Null            Null
Null         111             Null
bbb          222             Null 
Null         333             789
Null         555             Null 
eee          Null            303

使用SQL,我如何识别以下行中的“不在计划中”:

Null     Null       123
ccc      Null       456
ddd      444        202

在“实际上不在计划中”行中:

Null     555   Null 
eee      Null  303

谢谢您的帮助!

3 个答案:

答案 0 :(得分:0)

您可以使用LEFT JOIN。下面是MySql的示例。

未在计划中

SELECT Plan.* FROM Plan 
LEFT JOIN Actual ON (Plan.ID_1 = Actual.ID_1 AND Plan.ID_2 = Actual.ID_2 AND Plan.ID_3 = Actual.ID_3) 
WHERE Actual.ID_1 IS NULL AND Actual.ID_2 IS NULL AND Actual.ID_3 IS NULL;

实际上不在计划中

SELECT Actual.* FROM Actual 
LEFT JOIN Plan ON (Plan.ID_1 = Actual.ID_1 AND Plan.ID_2 = Actual.ID_2 AND Plan.ID_3 = Actual.ID_3) 
WHERE Plan.ID_1 IS NULL AND Plan.ID_2 IS NULL AND Plan.ID_3 IS NULL;

答案 1 :(得分:0)

尝试一下(我曾经使用不存在):

select *
from Plan p
where not exists 
(select 1 from Actual a
where a.ID_1 = p.ID_1
  and a.ID_2 = p.ID_2
  and a.ID_3 = p.ID_3
)

答案 2 :(得分:0)

如果使用的是ORACLE,则可以使用运算符MINUS。它将选择表“计划”中的行而不是表“实际”中的行。

SELECT ID_1, ID_2, ID_3
 FROM  Plan
MINUS
SELECT ID_1, ID_2, ID_3
 FROM  Actual;

如果使用的是SQL Server;使用EXCEPT而不是减号。