Возврат числа, когда набор результатов равен нулю - PullRequest
0 голосов
/ 30 июня 2019

Каждый объект лота содержит соответствующий список рабочих заданий. Этим рабочим заданиям назначены задачи, которые структурированы по задаче, установленной на родительском участке лотов (фаза). Я пытаюсь получить обратно LOT_ID и счет TASK_ID, где TASK_ID существует для условия where.

Проблема в том, что если TASK_ID не найден, результирующий набор равен нулю, а LOT_ID вообще не возвращается.

Я загрузил одну строку для LOT, PHASE и WORK_ORDER в следующий SQLFiddle. Я бы добавил больше данных, но есть забавный ограничитель ... я имею в виду ограничитель символов для редактора.

SQLFiddle

 SELECT W.[LOT_ID], COUNT(*) AS NUMBER_TASKS_FOUND
 FROM [PHASE] P
 JOIN [LOT] L ON L.[PHASE_ID] = P.[PHASE_ID]
 JOIN [WORK_ORDER] W ON W.[LOT_ID] = L.[LOT_ID]
 WHERE P.[TASK_SET_ID] = 1 AND W.[TASK_ID] = 41
 GROUP BY W.[LOT_ID] 

Запрос возвращает ожидаемый результат, когда идентификатор задачи найден (46), но нет результата, когда идентификатор задачи не найден (скажем, 41). В этом случае я ожидаю увидеть что-то вроде:

+--------+--------------------+
| LOT_ID | NUMBER_TASKS_FOUND |
+--------+--------------------+
|    500 |                  0 |
|    506 |                  0 |
+--------+--------------------+

У меня такое чувство, что его нужно поместить в подзапрос, а затем присоединить, но я не уверен, какой здесь будет синтаксис.

Моя истинная цель - иметь возможность передать список TASK_ID и получить любые LOT_ID, которые не совпадают, но сейчас я просто делаю запрос для каждой задачи, пока не смогу это выяснить.

1 Ответ

1 голос
/ 30 июня 2019

Вы хотите увидеть все лоты с их количеством для этой задачи. Поэтому либо внешнее присоединение к задачам, либо перекрестное применение их количества, либо использование подзапроса в предложении select.

select l.lot_id, count(wo.work_order_id) as number_tasks_found
from lot l
left join work_order wo on wo.lot_id = l.lot_id and wo.task_id = 41
where l.phase_id in (select p.phase_id from phase p where p.task_set_id = 1)
group by l.lot_id
order by l.lot_id;

или

select l.lot_id, w.number_tasks_found
from lot l
cross apply
(
  select count(*) as number_tasks_found
  from work_order wo
  where wo.lot_id = l.lot_id
  and wo.task_id = 41
) w
where l.phase_id in (select p.phase_id from phase p where p.task_set_id = 1)
order by l.lot_id;

или

select l.lot_id,
  (
    select count(*)
    from work_order wo 
    where wo.lot_id = l.lot_id 
    and wo.task_id = 41
  ) as number_tasks_found
from lot l
where l.phase_id in (select p.phase_id from phase p where p.task_set_id = 1)
order by l.lot_id;

Другим вариантом будет внешнее объединение счетчика и использование COALESCE, чтобы превратить ноль в ноль в вашем результате.

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