Мой вопрос ниже,

table1
study_a   causes
12a       accident
13b       noncausal
34a       accident
45b       xxxx

table2
study_b  cases_cause
12a      accident
13b      accident
34a      noncausal
45b      xxxx

Если study_a и приводит к тому, что столбцы из table1 совпадают со столбцами study_b иases_cause из table2, тогда создайте новый столбец, в котором мы устанавливаем флаг 1 для соответствия и 0 для несоответствия. Я использую Oracle 18g.

output

study   cause      match
12a       accident     1
13b       noncausal    0
34a       accident     0
45b       xxxx         1 

Запрос пробовал:

select
    case when ((iaw.study_a is not null and os.study_b is null )) then 1 
    when ((iaw.study_a is null  and os.study_b is not null )) then 0 
    when ((iaw.study_a is not null  and os.study_b is not null )) then 1 else 0 end as match 
from table1 as os left outer join table2 as iaw on os.study_b = iaw.study_a

Этот запрос дает мне сообщение об ошибке, говорящее, что оператор не завершен правильно, также я не уверен, что это правильный запрос для моих ожиданий. Пожалуйста, дайте мне знать ваши комментарии.

0
KSp 3 Фев 2021 в 13:37

3 ответа

Лучший ответ

Я настоятельно рекомендую использовать exists:

select t1.*,
       (case when exists (select 1
                          from table2 t2
                          where t1.study_a = t2.study_b and t1.causes = t2.cases_cause
                         )
             then 1 else 0
        end) as is_match
from table1 t1;

Причина, по которой я рекомендую exists, заключается в том, что JOIN (любого типа) может найти несколько совпадений и умножить количество строк в наборе результатов. EXISTS гарантирует, что ровно все строки из table1 будут возвращены один раз.

1
Gordon Linoff 3 Фев 2021 в 12:11

Вы можете использовать функцию декодирования, как показано ниже:

select t1.study_a, t1.causes, decode(t2.study_b, null, 0, 1)match
from table1 t1
left join table2 t2 
    on (t1.study_a = t2.study_b and t1.causes = t2.cases_cause)
order by 1
;
1
MDO 3 Фев 2021 в 10:48

Вы можете использовать выражение case следующим образом:

select a.study_a as study,
       a.causes as cause,
       case when a.causes = b.cases_cause then 1 else 0 end as match
from table1 a 
LEFT JOIN table2 b ON b.study_b = a.study_a

Несколько моментов, связанных с вашим запросом:

  • В вашем запросе нет ключевого слова SELECT
  • Вы использовали AS для присвоения псевдонима таблице. Oracle не разрешает AS при присвоении псевдонима таблице
  • Вы усложняете выражение case.
1
Popeye 3 Фев 2021 в 10:49
66025762