我有两个表,分别是计划表和实际表。每个表中的每一行都代表一个唯一的项目,我需要查找“计划”表中的项目,而不是“实际”表中的项目,反之亦然。
由三列唯一标识每个项目,并且这些列中的每一个的值都可以为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
谢谢您的帮助!
答案 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而不是减号。