Подзапросы SQL возвращают записи, но основной запрос в целом возвращает ноль строк - PullRequest
0 голосов
/ 18 февраля 2019

Этот запрос извлекает ноль строк в целом.Я попытался запустить каждый из подзапросов по отдельности, и каждый работает нормально.

Основная таблица 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 голосов
/ 18 февраля 2019

Вы, кажется, сделали это намного сложнее, чем нужно, если ваши требования верны.Из того, что вы говорите, вам нужно

1) Товары, которые прибыли 2019-01-01 и не были отправлены.

2) Товары, которые прибыли 2019-01-01 и были отправлены нав тот же день.

Есть ряд проблем с вашим текущим 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

Дайте мне знать, если я 'мы что-то упустили, но это, кажется, удовлетворяет перечисленным ниже требованиям.

Одна из проблем вашего текущего запроса заключается в том, что вы выполняете левое соединение строк, соответствующих первому требованию, и строк, соответствующих второму требованию.,Они никогда не должны объединяться, и поэтому вы никогда не получите строки / значения для вашего второго требования.В целом, я думаю, что вы запутали себя, используя слишком много ненужных подзапросов и объединений, а затем сделали это еще более запутанным, не используя уникальные псевдонимы, когда вы ссылались на одну и ту же таблицу несколько раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...