sql - 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 条记录写入@PatientVisitDataPRD
INNER JOIN 中的 76 条记录和右连接中的 422 条记录,其中 A.PatientVisitOID 为 NULL 这使我相信这 422 条记录应该从DELETE FROM @PatientVisitDataPRD
查询中删除。
解决方案
NOT IN
强烈不推荐使用子查询,因为如果子查询中的任何值为NULL
. 在您的情况下,这将导致不会删除任何行,我认为这是您的问题。
相反,尝试NOT EXISTS
:
DELETE pv
FROM @PatientVisitDataPRD pv
WHERE NOT EXISTS (SELECT 1
FROM @VisitOID v
WHERE v.PatientVisitOID = pv.PatientVisitOID
);
推荐阅读
- java - 未调用 finalize 方法时如何记录?
- java - JSerialComm Not Reading Whole String from Arduino
- android - How can I find the path to the latest installed build-tools in the Android SDK?
- c - How to read a .xyz file into an array of doubles?
- python-3.x - I can´t play one sound with winsound, but I can play an other one with same code
- django - django 推迟相关模型查询集中的所有字段
- android - Kotlin 中 RecyclerView 为空时如何显示其他视图?
- javascript - 在类和构造函数中访问 ES6 / ES7 静态类变量
- docker - 每次部署到 bitbucket 时,如何防止 docker 编译库?是否有任何 bitbucket 管道缓存?
- javascript - 如何使用来自多个 API 的多个返回数据来显示 API 数据?