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
);
很可能是我的语法错误,只是我没有意识到。
我有一个 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
);