具有 NOT IN 和 WHERE 关系的 SQL 查询与 GUID

use*_*665 1 sql sql-server subquery sql-delete sql-null

有两个表DocumentDocumentPos。在Document有列GUID和在DocumentPosDocumentGUID指表的列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
)
Run Code Online (Sandbox Code Playgroud)

但是当我执行select * from documentpos它时,例如返回一行DocumentGUID= B479BCB72334424DAC1B7CC26880DAB8。这DocumentGUIDNOT INDocument作为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
)
Run Code Online (Sandbox Code Playgroud)

第二个问题我也想知道:

为什么在括号中是FROM d不可能的,只有FROM Document

GMB*_*GMB 5

NOT IN is tricky with NULLs. You can use NOT EXISTS instead, which is null-safe. Also, I cannot see why you need to bring in the document table in the outer query.

I think that you want:

select *
from documentpos dp
where not exists (
    select 1 from document d where d.guid = dp.documentguid
)
Run Code Online (Sandbox Code Playgroud)

You can turn this to a delete statement as follows:

delete dp
from documentpos dp
where not exists (
    select 1 from document d where d.guid = dp.documentguid
)
Run Code Online (Sandbox Code Playgroud)