每个批次对象都包含一个相应的工单列表。这些工作单已分配有任务,这些任务由在批次父级(阶段)上设置的任务构成。我正在尝试找回LOT_ID
和一个TASK_ID
的数目,其中发现TASK_ID
存在于where条件。
问题是如果找不到TASK_ID
,结果集为null,并且根本不返回LOT_ID
。
我已将LOT
,PHASE
和WORK_ORDER
的一行上载到以下SQLFiddle。我会添加更多数据,但是有一个有趣的限制器.. err,我的意思是编辑器的字符限制器。
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
,但是现在我只是对每个任务进行查询,直到我能确定出来。
答案 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变为零。