簡體   English   中英

T-SQL DELETE FROM 未按預期工作

[英]T-SQL DELETE FROM Not working as expected

我的語法很可能是關閉的,我只是沒有意識到。

我有一個這樣定義的表:

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

然后我 go 關於將數據放入表@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 條記錄,在右連接中有 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
                     );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM