Mysql不在语句中不起作用

时间:2013-09-11 20:27:32

标签: mysql

简化问题:

如果我有以下内容(其中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列。

3 个答案:

答案 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)