我在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;
有人可以解释为什么?我哪里错了?
答案 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
行:
POFFICE_ID
表中一行的PDISTRICT
字段,其中PDISTRICT.ID
字段为NULL, - 或 - POFFICE_ID
表格中任意行的PDISTRICT
字段不匹配。所以 - 两个不同的查询,两个不同的结果。
祝你好运。