SQL子查询返回记录,但是主查询整体返回零行

时间:2019-02-17 22:11:34

标签: sql sqlite

此查询整体获取零行。我尝试过分别运行每个子查询,并且每个子查询都可以正常运行。

主表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 个答案:

答案 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

让我知道我是否错过了某些事情,但这似乎可以满足所列要求。

当前查询的问题之一是您正在执行从满足第一个要求的行到第二个行的左联接。他们永远不应该加入,因此您永远也不会获得第二个要求的行/值。总的来说,我认为您使用太多不必要的子查询和联接使自己感到困惑,然后当您多次引用同一张表时,由于不使用唯一别名,这使您更加困惑。

相关问题