2015-06-29 1 views
0

Я довольно новичок в написании сценариев SQL и хотел бы получить совет по наилучшему способу проверки статусов.Проверка статусов

Мне нужно найти все районы доставки, которые имеют по крайней мере один Delivery со статусом 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 

Существует больше данных, то, что показано выше, но это иллюстрирует то, что я верну.

Что бы быть лучшим способом проверить каждый уникальный район, чтобы увидеть, если он содержит STTS_ID из 2, а также имеет поставку, которая содержит STTS_ID 1, 3 или 4.

Кодовые образцы не обязательно что я ищу здесь, хотя они были бы оценены ... Я больше пытаюсь обернуть голову вокруг наиболее эффективного способа решения этой задачи ...

Заранее благодарю вас за предоставленную помощь.

ответ

0

Предварительно выберите данные со статусом 2 и сделайте стандартный внутренний JOIN.

E.g. pseudo-SQL:

select st134.area,st134.status 
from (select area 
     from mytable 
     where status = 2) st2, 
    mytable st134 
where st134.area = st2.area 

Это должен быть самый чистый и эффективный способ обеспечения эффективности.

+0

Это дало мне направление, в котором я нуждался. Спасибо, Саймон – michaelk46

0

У меня нет четкого понимания двух статусов diff, которые вы имеете в виду, но я выделил два. с хорошим пониманием в пункте может быть устранено с условием существования.

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); 
0

Этот запрос показывает только области, содержащие задачи со статусом = 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