我是编写SQL脚本的新手,并希望获得有关检查状态的最佳方法的一些建议。
我需要找到至少有一个状态为2的交货的所有交货区域并检查相同的区域,以查看这些区域的任何其他交货是否具有1,3或4的状态。
这是我目前所写的内容......
SELECT
DR.AREA,
T.STTS_ID
FROM TASK T
LEFT OUTER JOIN DLY_RTE_ASGMNT DRA
ON T.TASK_ID = DRA.TASK_ID
LEFT OUTER JOIN DLY_RTE DR
ON DR.DLY_RTE_ID = DRA.DLY_RTE_ID
WHERE
DR.AREA IS NOT NULL
ORDER BY DR.AREA
这是我从中获得的输出:
AREA STTS_ID
000-ST 1
000-ST 3
000-ST 1
000-ST 1
000-ST 2
100 1
100 1
100 1
100 1
100 1
上面显示了更多的数据,但它说明了我得到的回报。
检查每个唯一AREA以查看它是否包含STTS_ID为2并且包含STTS_ID为1,3或4的传递的最佳方法是什么。
编码样本不一定是我在这里寻找的东西,虽然他们会受到赞赏...我正在尝试围绕最有效的方式来完成任务......
提前感谢您提供任何帮助。
答案 0 :(得分:0)
预先选择状态为2的数据并进行标准内部连接。
E.g。伪SQL:
createButton()
这应该是最干净,效率最高的方法。
答案 1 :(得分:0)
我没有清楚地了解你所指的两个差异状态,但我已经分开了两个。在条款中有很好的理解可以用exists子句来消除。
with tab_stts2 as
(select * from task where status=2)
select dra.area, tab_stts2.stts_id from tab_stts2, dly_rte_asgmnt dra, dly_rte dr
where tab_stts2.task_id = dra.task_id
and dra.dly_rte_id = dra.dly_rte_id
and (status table alias).status in (1,3,4);
答案 2 :(得分:0)
此查询仅显示包含status = 2的任务的区域,并且在单独的列中显示具有状态1,3,4的任务的数量:
select area,
count(case when stts_id = 1 then 1 end) st1,
count(case when stts_id = 3 then 1 end) st3,
count(case when stts_id = 4 then 1 end) st4
from task
join dly_rte_asgmnt dra using (task_id)
join dly_rte using (dly_rte_id)
group by area
having count(case when stts_id = 2 then 1 end) > 0