首页 > 解决方案 > 具有 NOT IN 和 WHERE 关系的 SQL 查询与 GUID

问题描述

有两个表DocumentDocumentPos。在Documentthere is columnGUID和 in DocumentPosis columnDocumentGUID是指 table Document

我想让每一行都在DocumentPosDocumentGUID现在所在的行中Documents' GUID

我有这个返回 0 行的查询:

select *
FROM             Document d,
                 DocumentPos dp
WHERE            d.GUID = dp.DocumentGUID
AND              dp.DocumentGUID NOT IN (
                 SELECT d.GUID
                 FROM Document
)

但是,当我执行select * from documentpos它时,它会返回例如带有DocumentGUID=的行B479BCB72334424DAC1B7CC26880DAB8。这DocumentGUIDNOT IN作为. Document_GUID

select * from Document where GUID = 'B479BCB72334424DAC1B7CC26880DAB8'返回 0 行。

我想像这样构建查询,因为它应该成为一个DELETE语句:

DELETE           dp
FROM             Document d,
                 DocumentPos dp
WHERE            d.GUID = cp.DocmentGUID
AND              dp.DocumentGUID NOT IN (
                 SELECT d.GUID
                 FROM Document
)

第二个问题我也想知道:

为什么括号中FROM d不可能而且只有FROM Document

标签: sqlsql-serversubquerysql-deletesql-null

解决方案


NOT INs很棘手NULL。您可以改用NOT EXISTS它,它是 null 安全的。另外,我看不出为什么需要document在外部查询中引入表。

我认为你想要:

select *
from documentpos dp
where not exists (
    select 1 from document d where d.guid = dp.documentguid
)

您可以将其转换为删除语句,如下所示:

delete dp
from documentpos dp
where not exists (
    select 1 from document d where d.guid = dp.documentguid
)

推荐阅读