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