2016-11-18 4 views
0

Итак, я хотел бы создать флаг, основанный на нескольких атрибутах и ​​нескольких критериях. Ниже приведен вид структуры я иду за относительно флагов, которые я хочу задать:Можно ли включить запросы в структуру корпуса?

select a.*, b.WINNERID, 
    case when (QUERY 1) then 1 
     when (QUERY 2) then 2 
     when (QUERY 3) then 3 
     when (QUERY 4) then 4 
     else 5 
    end as priority 
from MYTABLE a 
left outer join MYSECONDTABLE b 
on a.ID = b.ID 
order by GROUP_ID, priority; 

То, что я хотел бы сделать сейчас, чтобы использовать следующие вопросы, как то, что мои дела должны быть. Запросы не обязательно смотрят на одни и те же атрибуты; Мы рассматриваем несколько атрибутов и придаем каждому важность.

Запрос 1 имеет для нас самое большое значение, Query 4 является самым низким.

Что бы я хотел сделать, это в основном фильтр вниз по набору данных, основанный на уровне важности. Поэтому давайте скажем, что наш набор данных - 100 записей; если в случае 1 разрешается 30, тогда запрос для случая 2 должен смотреть только на остальные 70. 30, разрешенные в случае 1, получат приоритет 1 в качестве отдельного поля.

Запрос 1

select b.WINNERID, a.* 
from MYTABLE a 
join MYSECONDTABLE b 
on a.ID=b.ID 
where WINNERID is not null; 

Запрос 2

select GROUP_ID, ID from MYTABLE where COLUMN1 = 'Y' and GROUP_ID in 
(
    select tb1.GROUP_ID from MYTABLE tb1 join MYTABLE tb2 on 
    tb1.GROUP_ID = tb2.GROUP_ID 
    and to_number(substr(tb1.GROUP_ID,10,3)) =2 
    and tb1.COLUMN1 = 'Y' and tb2.COLUMN1 = 'N' 
); 

Запрос 3

select distinct GROUP_ID from MYTABLE where COLUMN1 = 'Y' and GROUP_ID in 
(
    select tb1.GROUP_ID from MYTABLE tb1 join MYTABLE tb2 on 
    tb1.GROUP_ID = tb2.GROUP_ID 
    and to_number(substr(tb1.GROUP_ID,10,3)) =2 
    and tb1.COLUMN1 = 'Y' and tb2.COLUMN1 = 'Y' 
    and tb1.ID > tb2.ID 
); 

Запрос 4

select tb1.GROUP_ID from MYTABLE tb1 join MYTABLE tb2 on 
    tb1.GROUP_ID = tb2.GROUP_ID 
    and to_number(substr(tb1.GROUP_ID,10,3)) =2 
    and tb1.LAST_THING like 'WHATEVER%' and (tb2.LAST_THING not like WHATEVER%' or tb2.LAST_THING is null); 

Я хотел бы установить флаг для каждого из этих запросов, показывая полные записи. Как я могу объединить их? Можно ли это сделать? Есть ли другой способ, которым я должен пытаться это сделать?

EDIT:

В основном это то, что мне нужно:

If (Query 1) флаг, то флаг = 1, в противном случае (Query 2) флаг = 2, в противном случае (Query 3) = 3 , else if (Query 4) flag = 4, else flag = 0

+1

Просьба предоставить образец входных данных как можно меньше, сохраняя при этом усложнения, которые вы ожидаете. То, как вы написали свою попытку, невозможно; КОГДА в выражении CASE ожидает условие (true или false), а подзапрос не возвращает логическое значение (true или false).Вместо того, чтобы пытаться угадать, что вы хотели сделать, лучше всего сказать нам. Не через код, а на простом английском. – mathguy

+0

В основном это то, что мне нужно: If (Query 1) then flag = 1, else if (Query 2) flag = 2, else if (Query 3) flag = 3, else if (Query 4) flag = 4, else flag = 0 – user7002207

+0

Что это значит? Запрос 1 не является истинным или ложным, поэтому что означает игрушка, если query1? – mathguy

ответ

0

Вы не можете использовать запросы в операторе CASE, как вы показали, потому что запрос не возвращает возвращаемое значение. Вы ничего не можете сравнить с QUERY1, например, потому что QUERY1 не то, что вы можете использовать в выражении.

Возможно, один из способов сделать то, что вы пытаетесь сделать, будет использовать ваши запросы как общие табличные выражения и крест присоединиться к ним в основном запросе, например:

WITH QUERY1 AS (select b.WINNERID, 
         a.* 
        from MYTABLE a 
        join MYSECONDTABLE b 
        on a.ID=b.ID 
        where WINNERID is not null), 
    QUERY2 AS (select GROUP_ID, ID 
        from MYTABLE 
        where COLUMN1 = 'Y' AND 
         GROUP_ID IN(select tb1.GROUP_ID 
             from MYTABLE tb1 
             join MYTABLE tb2 
             on tb1.GROUP_ID = tb2.GROUP_ID AND 
              to_number(substr(tb1.GROUP_ID,10,3)) = 2 AND 
              tb1.COLUMN1 = 'Y' AND 
              tb2.COLUMN1 = 'N')), 
    QUERY3 AS (select distinct GROUP_ID 
        from MYTABLE 
        where COLUMN1 = 'Y' AND 
         GROUP_ID IN (select tb1.GROUP_ID 
             from MYTABLE tb1 
             join MYTABLE tb2 
             ON tb1.GROUP_ID = tb2.GROUP_ID AND 
              to_number(substr(tb1.GROUP_ID,10,3)) = 2 AND 
              tb1.COLUMN1 = 'Y' and tb2.COLUMN1 = 'Y' AND 
              tb1.ID > tb2.ID)), 
    QUERY4 AS (select tb1.GROUP_ID 
        from MYTABLE tb1 
        join MYTABLE tb2 
        on tb1.GROUP_ID = tb2.GROUP_ID AND 
         to_number(substr(tb1.GROUP_ID,10,3)) = 2 AND 
         tb1.LAST_THING like 'WHATEVER%' AND 
         (tb2.LAST_THING not like 'WHATEVER%' or tb2.LAST_THING is null)) 
select a.*, 
     b.WINNERID, 
     case when q1.WINNERID > 0 then 1 
      when q2.GROUP_ID > 0 then 2 
      when q3.GROUP_ID > 0 then 3 
      when q4.GROUP_ID > 0 then 4 
      else 5 
     end as priority 
    from MYTABLE a 
    left outer join MYSECONDTABLE b 
    on a.ID = b.ID 
    CROSS JOIN QUERY1 q1 
    CROSS JOIN QUERY2 q2 
    CROSS JOIN QUERY3 q3 
    CROSS JOIN QUERY4 q4 
    order by GROUP_ID, priority 

Возьмите это как пример кода , Я не знаю, каковы фактические условия, которые вы хотите проверить в заявлении CASE, поэтому вам нужно внести соответствующие изменения.

Удачи.

+0

Запрос CAN возвращает значение (они называются «скалярными запросами»), и запрос МОЖЕТ использоваться в части WHEN выражения CASE (например, 'WHEN (выберите count (*) from ....)! = 0 THEN ... ', так что часть ответа неверна. Проблема с тем, что показал OP, заключается в том, что он хочет, чтобы запрос возвращал значение BOOLEAN, и это невозможно. – mathguy

+0

@mathguy, если только вы завершаете его с помощью EXISTS, например 'case when exists (select ... from ...) then 1 else 2 end' –

+0

@DuduMarkovitz - Правильно, но' exists (select ...) 'не является запросом. – mathguy

Смежные вопросы