1

有两个表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

4

2 回答 2

5

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
)
于 2019-12-05T09:39:43.473 回答
2

我所能理解的是,您想从DocumentPos表中删除 Main 表Document中不存在的数据。您可以使用以下查询:

DELETE dp FROM DocumentPos dp
left join Document d on d.GUID = dp.DocumentGUID
where d.GUID is null
于 2019-12-05T09:45:42.747 回答