首页 > 解决方案 > T-SQL DELETE FROM 未按预期工作

问题描述

我的语法很可能是关闭的,我只是没有意识到。

我有一个这样定义的表:

-- Get all of the PatientVisitOID for which we want data
DECLARE @VisitOID TABLE (PatientVisitOID INT)

INSERT INTO @VisitOID
SELECT DISTINCT PatientVisitOID
FROM SMSDSS.c_covid_ptvisitoid_tbl

然后我开始将数据放入表@PatientVisitDataDSS(历史数据仓库)和@PatientVisitDataPRD(仅在任何一天的今天生产)

我运行这样一个有效的查询(从临时数据仓库房屋表中删除所有记录,其中访问 ID 在 PROD 中 - 我们想要产品版本):

DELETE FROM @PatientVisitDataDSS
WHERE PatientVisitOID IN (SELECT A.PatientVisitOID FROM @PatientVisitDataPRD AS A)

然后在它的正下方运行它(这不起作用 - 从 prod 临时表中删除不在我们原来的 id 编号列表中的@VisitOID记录)我觉得这应该删除 422 条记录并保留 76 条:

DELETE FROM @PatientVisitDataPRD
WHERE PatientVisitOID NOT IN (SELECT A.PatientVisitOID FROM @VisitOID AS A)

我知道存在应该删除的记录,因为我可以运行以下命令并获得几百条记录(422 条记录):

SELECT B.PatientVisitOID
FROM @VisitOID AS A
RIGHT JOIN @PatientVisitDataPRD AS B ON A.PatientVisitOID = B.PatientVisitOID
WHERE A.PatientVisitOID IS NULL

我还可以通过运行(76条记录)看到应该保留的记录:

SELECT A.PatientVisitOID
FROM @PatientVisitDataPRD AS A
INNER JOIN @VisitOID AS B ON A.PatientVisitOID = B.PatientVisitOID

目前有 498 条记录写入@PatientVisitDataPRDINNER JOIN 中的 76 条记录和右连接中的 422 条记录,其中 A.PatientVisitOID 为 NULL 这使我相信这 422 条记录应该从DELETE FROM @PatientVisitDataPRD查询中删除。

标签: sqlsql-serversql-server-2014

解决方案


NOT IN强烈不推荐使用子查询,因为如果子查询中的任何值为NULL. 在您的情况下,这将导致不会删除任何行,我认为这是您的问题。

相反,尝试NOT EXISTS

DELETE pv
    FROM @PatientVisitDataPRD pv
    WHERE NOT EXISTS (SELECT 1
                      FROM @VisitOID v
                      WHERE v.PatientVisitOID = pv.PatientVisitOID
                     );

推荐阅读