简化问题:
如果我有以下内容(其中CN = name,UID = emp.ID,以及supervisor =主管的身份证号码):
CN UID supervisor
Jerry 4 NULL
Dave 11 15
Dan 12 16
Jack 13 17
Jason 14 11
Tom 10 15
Berry 16 12
我希望Dave或Dan都不在名单上,因为他们也是主管(第二或更高)。
SELECT
reports_accreditallfr.cn,
reports_accreditallfr.uid,
reports_accreditallfr.supervisor
FROM
reports_accreditallfr
WHERE
reports_accreditallfr.uid NOT IN ( reports_accreditallfr.supervisor)
我目前的陈述给出了一切。我猜我的NOT IN语句只是逐行工作而不是扫描整个supervisor列。
答案 0 :(得分:1)
你需要一个子查询。
SELECT reports_accreditallfr.cn, reports_accreditallfr.uid,
reports_accreditallfr.supervisor
FROM reports_accreditallfr
WHERE reports_accreditallfr.uid NOT IN (select reports_accreditallfr.supervisor
from reports_accreditallfr
where reports_accreditallfr.supervisor is not null
);
你的表达相当于:
reports_accreditallfr.uid <> reports_accreditallfr.supervisor
这可能在所有行上都是正确的。
答案 1 :(得分:1)
如果要省略uid
列中supervisor
列中显示值的行(表格中至少有一行),并且uid
是{保证是独一无二的,
你可以使用“反连接”模式获得它:
SELECT r.cn
, r.uid
, r.supervisor
FROM reports_accreditallfr r
LEFT
JOIN reports_accreditallfr s
ON s.supervisor = r.uid
WHERE s.supervisor IS NULL
注意:LEFT JOIN操作返回r
的所有行,WHERE
子句省略了返回s
的至少一个匹配行的任何行。
与所选答案中的查询相比,此查询略有不同。此查询将返回uid
中具有NULL值的行,而所选答案中的查询将省略(因为谓词NULL NOT IN (foo)
不会返回“true”。
可以修改所选答案中的查询以包含OR uid IS NULL
谓词以匹配此查询; - 或 - 可以更改此查询以包含AND r.uid IS NOT NULL
谓词,以使结果集匹配。
(我们没有任何对uid具有NULL值的行的示例;但在更一般的情况下,只需注意一些事项。)
答案 2 :(得分:0)
尝试对SELECT
NOT IN
语句
SELECT
reports_accreditallfr.cn,
reports_accreditallfr.uid,
reports_accreditallfr.supervisor
FROM
reports_accreditallfr
WHERE
reports_accreditallfr.uid NOT IN (SELECT reports_accreditallfr.supervisor FROM reports_accreditallfr)
您还可以将语句简化为以下内容:
SELECT
cn,
uid,
supervisor
FROM
reports_accreditallfr
WHERE
uid NOT IN (SELECT supervisor FROM reports_accreditallfr)