Oracle SQL SELECT不起作用

时间:2018-02-16 12:48:54

标签: sql oracle

我在Oracle中有这个SELECT:

SELECT
     po.id, po.name
FROM 
     poffice po
WHERE 
po.id not in 
(
    select distinct 
        poffice_id 
    from pdistrict
);

不返回任何值。 但是下一个代码会返回一些记录。

SELECT
   po.id, po.name
FROM
    poffice po
    LEFT JOIN pdistrict pd 
    ON po.ID = pd.poffice_id
WHERE pd.ID IS NULL;

有人可以解释为什么?我哪里错了?

4 个答案:

答案 0 :(得分:1)

您很可能在PDISTRICT中有POFFICEID为空的记录。如果是这种情况,则NOT IN的半联接将无效。

您的第二个查询与此相同(假设poffice.id不可为空):

SELECT po.id, po.name
  FROM poffice po
 WHERE po.id NOT IN (SELECT poffice_id 
                       FROM pdistrict 
                      WHERE pofficed_id IS NOT NULL);

答案 1 :(得分:0)

假设您的数据正确无误,问题是not in。如果子查询返回的任何值为NULL,则不返回任何行。这就是为什么我强烈建议总是使用not exists而不是not in使用子查询:

SELECT po.*
FROM poffice po
WHERE NOT EXISTS (SELECT 1 FROM pdistrict pd WHERE pd.poffice_id = po.id);

答案 2 :(得分:0)

如果您想要检索没有po.id的办公室,那么您可以使用带有空条件的简单选择查询。

 SELECT
     po.id, po.name
FROM 
     poffice po
WHERE 
po.id is NULL;

答案 3 :(得分:0)

您发布的两个查询会执行不同的操作,因此会得到不同的结果。

在第一个查询中,您正在查找POFFICE字段与ID表中任意行的POFFICE_ID字段不匹配的PDISTRICT行。

在第二个查询中,您正在查找POFFICE字段的ID行:

  1. 匹配POFFICE_ID表中一行的PDISTRICT字段,其中PDISTRICT.ID字段为NULL, - 或 -
  2. POFFICE_ID表格中任意行的PDISTRICT字段不匹配。
  3. 所以 - 两个不同的查询,两个不同的结果。

    祝你好运。