结果集为空时返回数字

时间:2019-06-29 22:47:12

标签: sql sql-server

每个批次对象都包含一个相应的工单列表。这些工作单已分配有任务,这些任务由在批次父级(阶段)上设置的任务构成。我正在尝试找回LOT_ID和一个TASK_ID的数目,其中发现TASK_ID存在于where条件。

问题是如果找不到TASK_ID,结果集为null,并且根本不返回LOT_ID

我已将LOTPHASEWORK_ORDER的一行上载到以下SQLFiddle。我会添加更多数据,但是有一个有趣的限制器.. err,我的意思是编辑器的字符限制器。

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] 

当找到任务ID时,查询返回预期结果(46),但未找到任务ID时,则没有结果(例如41)。在那种情况下,我希望看到类似的东西:

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

我觉得这需要包装在子查询中,然后再加入,但是我不确定这里的语法是什么。

我的真正目标是能够传递TASK_ID的列表并获取任何不匹配的LOT_ID,但是现在我只是对每个任务进行查询,直到我能确定出来。

1 个答案:

答案 0 :(得分:1)

您想查看所有批次及其任务计数。因此,要么外部加入任务,要么交叉应用其计数,或者在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将结果中的null变为零。