簡體   English   中英

用於識別缺失記錄的 SQL 查詢(NOT IN 子查詢)

[英]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.

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