T-SQL DELETE FROM 未按预期工作

T-SQL DELETE FROM Not working as expected

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

我有一个 table 是这样定义的:

-- 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

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

我 运行 这样的查询有效(从临时数据仓库中删除所有记录 table 其中访问 ID 在 PROD 中 - 我们想要 prod 版本):

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

然后直接在它下面我 运行 这个(这不起作用 - 从 prod temp table 中删除不在我们 @VisitOID 中的原始 ID 编号列表中的记录) 我觉得这应该删除 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

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

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

目前在 @PatientVisitDataPRD 中有 498 条记录,其中 INNER JOIN 有 76 条记录,右连接有 422 条记录,其中 A.PatientVisitOID IS NULL 这让我相信这 422 条记录应该从 DELETE FROM @PatientVisitDataPRD 查询中删除。

强烈不建议使用带有子查询的

NOT IN,因为如果子查询中的 any 值为 NULL,它会出现意外行为。在你的情况下,这将导致没有行被删除,我认为这是你的问题。

相反,尝试 NOT EXISTS:

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