检查状态

时间:2015-06-29 12:35:32

标签: sql oracle

我是编写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的传递的最佳方法是什么。

编码样本不一定是我在这里寻找的东西,虽然他们会受到赞赏...我正在尝试围绕最有效的方式来完成任务......

提前感谢您提供任何帮助。

3 个答案:

答案 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的任务的数量:

SQLFiddle

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