[英]SQL Query to Identify Missing Records (NOT IN subquery)
我正在嘗試編寫一個查詢,它將返回為文檔類型 6553 而不是 6554 生成的打印作業的每個 ID(文檔類型 6553 和 6554 之間的共享值) - 這些都是為了始終一起生成。
我嘗試了以下操作,這需要很長時間才能運行並產生一些對我來說似乎太高的值:
select ID from PrintQueueShadow
where DocumentType = '6553'
and CreateDate > getdate() - 7 --No more than 7 days old
and ID not in
(select ID from PrintQueueShadow
where CreateDate > getdate() - 7
and DocumentType = '6554') --Checking against every ID for Doc Type 6554s sent in the last 7 days
任何幫助將非常感激。 謝謝!
您的邏輯看起來是正確的,但我們可以通過使用存在邏輯來改進您所擁有的。 此外,我們可以嘗試建議一個可以加快查詢速度的索引。
SELECT ID
FROM PrintQueueShadow pqs1
WHERE DocumentType = '6553' AND CreateDate > GETDATE() - 7 AND
NOT EXISTS (
SELECT 1
FROM PrintQueueShadow pqs2
WHERE pqs2.ID = pqs1.ID AND
CreateDate > GETDATE() - 7 AND
DocumentType = '6554'
);
使用EXISTS
可能比WHERE IN (...)
執行得更好,因為前者讓數據庫在子查詢中找到匹配記錄后立即停止搜索。
上述查詢可能受益於以下索引:
CREATE INDEX idx ON PrintQueueShadow (ID, DocumentType, CreateDate);
您也可以嘗試對上述索引中的三列進行排列。
您可以嘗試使用自我加入。
SELECT DISTINCT PQS_1.ID
FROM PrintQueueShadow AS PQS_1
LEFT JOIN PrintQueueShadow AS PQS_2
ON PQS_1.ID = PQS_2.ID
AND PQS_2.CreateDate > GETDATE() - 7
AND PQS_2.DocumentType = '6554' --Checking against every ID for Doc Type 6554s sent in the last 7 days
WHERE PQS_1.DocumentType = '6553'
AND PQS_1.CreateDate > GETDATE() - 7 --No more than 7 days old
AND PQS_2.ID IS NULL -- Excluding ID which have been found in Doc Type 6553
我還添加了DISTINCT
語句,以防給定DocumentType
中的ID
重復
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.