此查询整体获取零行。我尝试过分别运行每个子查询,并且每个子查询都可以正常运行。
主表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
答案 0 :(得分:2)
如果您的要求是正确的,那么您似乎比需要做的要复杂得多。根据您的需求
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
让我知道我是否错过了某些事情,但这似乎可以满足所列要求。
当前查询的问题之一是您正在执行从满足第一个要求的行到第二个行的左联接。他们永远不应该加入,因此您永远也不会获得第二个要求的行/值。总的来说,我认为您使用太多不必要的子查询和联接使自己感到困惑,然后当您多次引用同一张表时,由于不使用唯一别名,这使您更加困惑。