簡體   English   中英

SQL子查詢返回記錄,但是主查詢整體返回零行

[英]SQL subqueries return records, but the main query as a whole returns zero rows

該查詢整體上獲取零行。 我試過分別運行每個子查詢,並且每個工作正常。

主表ITEMS包含庫存中的所有項目。 ISSUED包含從主商店發出的item IDs

我在此主查詢中運行兩個子查詢。 一個用於獲取在特定日期進入庫存但尚未發貨的庫存中所有項目的數量,另一個用於獲取當天進入庫存的所有項目的數量,但是在同一天發行。

我需要獲取按項目名稱分組的這兩個項目的總數。

SELECT ITEMS.ITEM AS ITEM,
   ( IFNULL(Arr1.TAG_COUNT, 0)
     + IFNULL(Arr2.TAG_COUNT, 0) ) AS TAG_COUNT 
 FROM   ((SELECT ITEMS.ITEM      AS ITEM,
           Count(ITEMS.ID) AS TAG_COUNT
    FROM   ITEMS
    WHERE  ITEMS.DT_ARRIVAL = '2019-01-01'
           AND ITEMS.ID NOT IN (SELECT ISSUED.ID
                                FROM   ISSUED)
    GROUP  BY ITEMS.ITEM) AS Arr1
    LEFT JOIN (SELECT ITEMS.ITEM      AS ITEM,
                      Count(ITEMS.ID) AS TAG_COUNT
               FROM   ITEMS
                      LEFT JOIN ISSUED
                             ON ISSUED.ID = ITEMS.ID
               WHERE  ITEMS.ID IN (SELECT ISSUED.ID
                                   FROM   ISSUED)
                      AND ISSUED.DATE = '2019-01-01'
               GROUP  BY ITEMS.ITEM) AS Arr2
           ON Arr2.ITEM = Arr1.ITEM
    LEFT JOIN ITEMS
           ON ITEMS.ITEM = Arr1.ITEM)
GROUP  BY ITEMS.ITEM  

如果您的要求是正確的,那么您似乎會使事情變得復雜得多。 根據您的需求

1)2019年1月1日到達的物品尚未發貨。

2)物品於2019年1月1日到達並在同一天發貨。

當前的SQL存在很多問題,但是您可以使用簡單的OR子句更輕松地獲得結果:

SELECT A.ITEM, COUNT(*)
FROM ITEMS A
WHERE A.DT_ARRIVAL = '2019-01-01'
AND ( NOT EXISTS (SELECT 1 FROM ISSUED B WHERE A.ID = B.ID)
     OR (EXISTS (SELECT 1 FROM ISSUED C WHERE A.ID = C.ID
         AND C.ISSUED_DT = A.DT_ARRIVAL)
  )
GROUP BY A.ITEM

讓我知道是否遺漏了一些東西,但這似乎可以滿足所列要求。

當前查詢的問題之一是,您正在進行從滿足第一個要求的行到第二個行的左聯接。 他們永遠不應該加入,因此您永遠也不會獲得第二個要求的行/值。 總的來說,我認為您使用太多不必要的子查詢和聯接使自己感到困惑,然后當您多次引用同一張表時,由於不使用唯一別名,這使您更加困惑。

暫無
暫無

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

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