SQL: случай, когда после нескольких левых соединений - PullRequest
0 голосов
/ 30 августа 2018

Я использую MySQL с таблицей под названием students. Я пытаюсь добавить столбец, в котором указано, приехал ли студент из США, Европы, Южной Америки или нет. В частности, я хотел бы поставить 0 в столбце, если ни один из них не соответствует действительности, 1, если США, 2, если Европа, 3, если Южная Америка.

Итак, я делаю что-то вроде этого:

SELECT name,
CASE WHEN ... 
FROM original_table or
LEFT JOIN us_table us
ON or.student_id = us.student_id
LEFT JOIN europe_table eur
ON or.student_id = eur.student_id
LEFT JOIN south_america_table sa
ON or.student_id = sa.student_id

У меня проблемы с CASE WHEN частью. Я мог бы просто сказать что-то вроде «когда столбец id из таблицы США не равен нулю, а остальные столбцы id (из Европы и Южной Америки) равны нулю, записать 1.

Аналогичным образом, если столбец id из таблицы Europe не равен нулю, а столбцы id таблицы США и Южной Америки имеют значение null, запишите значение 2.

Есть ли лучший способ?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

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

Я бы просто использовал exists:

SELECT name,
       (CASE WHEN EXISTS (SELECT 1 FROM us_table us WHERE ot.student_id = us.student_id)
             THEN 1
             WHEN EXISTS (SELECT 1 FROM europe_table eur WHERE ot.student_id = eur.student_id)
             THEN 2
             WHEN EXISTS (SELECT 1 FROM south_america_table sa WHERE ot.student_id = sa.student_id)
             THEN 3
             ELSE 0
        END) as origin
FROM original_table ot;

Я также изменил псевдоним таблицы на ot с or, потому что or является зарезервированным словом.

0 голосов
/ 30 августа 2018

Тестирование каждого против NULL кажется лучшим способом. Используйте ELSE для значения 0.

CASE WHEN us.student_id IS NOT NULL THEN 1
     WHEN eur.student_id IS NOT NULL THEN 2
     WHEN sa.student_id IS NOT NULL THEN 3
     ELSE 0
END 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...