我有批量实体和作业实体。批处理可以有很多作业。
现在,Job有一个名为'status'
的列,其值为'REVIEW', 'NEW', 'EDIT'
和'QA'
。
如果属于这些批次的任何作业的状态为'YES'
,并且'REVIEW'
没有作业的状态为'NO'
,则需要选择值为'REVIEW'
的所有批次并且查询将按批处理分组。
Select Batches.name, Batches.<column_I_need>, Batches.user_id
INNER JOIN Jobs ON Jobs.batch_id = Batches.id
GROUP BY Batches.id;
答案 0 :(得分:2)
使用条件聚合来检查您的要求:
SELECT
b.id,
b.name,
b.user_id,
CASE WHEN SUM(CASE WHEN j.status = 'REVIEW' THEN 1 ELSE 0 END) > 0
THEN 'YES'
ELSE 'NO' END AS status
FROM Batches b
INNER JOIN Jobs j
ON j.batch_id = b.id
GROUP BY
b.id;
假设Batches.id
是该表的主键列,那么如果我们GROUP BY
该列,我们也可以从Batches
表中选择任何列。
答案 1 :(得分:1)
我会使用case exists
执行此操作:
Select b.name, b.user_id,
(case when exists (select 1
from jobs j
where j.batch_id = b.id and j.status = 'Review'
)
then 'Yes' else 'No'
end) as status
from batches b;
这种方法比聚合方法更有效,因为它消除了group by
。使用jobs(batch_id, status)
上的索引,这将具有最佳性能。