use*_*665 1 sql sql-server subquery sql-delete sql-null
有两个表Document和DocumentPos。在Document有列GUID和在DocumentPos是DocumentGUID指表的列Document。
我想让每一行都在
DocumentPos它DocumentGUID现在的行中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。这DocumentGUID是NOT 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
)
Run Code Online (Sandbox Code Playgroud)
第二个问题我也想知道:
为什么在括号中是
FROM d不可能的,只有FROM Document?
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)