【问题标题】:T-SQL DELETE FROM Not working as expectedT-SQL DELETE FROM 未按预期工作
【发布时间】:2021-06-02 06:08:10
【问题描述】:

很可能是我的语法不正确,我只是没有意识到。

我有一个这样定义的表:

-- 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 临时表中删除不在 @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

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

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

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

【问题讨论】:

标签: sql sql-server sql-server-2014


【解决方案1】:
强烈建议不要使用带有子查询的

NOT IN,因为如果子查询中的 any 值为 NULL,则会出现意外行为。在您的情况下,这将导致不会删除任何行,我认为这是您的问题。

试试NOT EXISTS:

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

【讨论】:

  • 谢谢,我试试看,可能是表中的单个 NULL 值有问题?
  • @MCP_infiltrator 。 . .不是“也许”。绝对。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 2013-11-27
  • 1970-01-01
相关资源
最近更新 更多