Выберите из двух таблиц, добавив поле с определенным значением при определенных условиях - PullRequest
0 голосов
/ 25 января 2019
Table1: Students
ID              Name        EternalToken
200901212       Joe         xxxxxx
200809922       David       yyyyyy
201009122       Chris       zzzzzz

Table2: Banned
ID      StudentID
1       200901212

Я хочу выбрать всех учеников и отобразить дополнительное поле, в котором указано, что ученик был забанен, скрыв EternalToken

SELECT * FROM Students s 
LEFT JOIN Banned b
ON s.ID = b.StudentID

. При этом отобразятся обе таблицы.вместе взятые.Тем не менее, я хочу, чтобы результат был таким:

ID              Name        EternalToken    Banned
200901212       Joe         NULL            1
200809922       David       yyyyyy          0
201009122       Chris       zzzzzz          0

Только студенты, которые были забанены, должны иметь EternalToken = NULL

Обратите внимание, что это пример того, что япытаюсь добиться и не совсем то, что я делаю.Студенты и Banned - только пример, я знаю, что это не много ко многим отношениям, поэтому я могу сделать это только в одной таблице.Но технический ответ на этот вопрос очень поможет мне в достижении гибкого решения.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Используйте case и exists:

SELECT s.*,
       (CASE WHEN EXISTS (SELECT 1 FROM banned b WHERE s.ID = b.StudentID)
             THEN 1 ELSE 0
        END) as is_banned
FROM Students s ;

В MySQL вы можете упростить это до:

SELECT s.*,
       ( EXISTS (SELECT 1 FROM banned b WHERE s.ID = b.StudentID) ) as is_banned
FROM Students s ;

Я предпочитаю EXISTS подходу LEFT JOIN, потому что логика проясняет, что никакие строки не будут добавлены. LEFT JOIN будет умножать количество строк, если есть дубликаты в banned.

0 голосов
/ 25 января 2019

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

SELECT
    s.ID,
    s.Name,
    CASE WHEN b.StudentID IS NOT NULL THEN NULL ELSE s.EternalToken END AS EternalToken,
    CASE WHEN b.StudentID IS NULL THEN 0 ELSE 1 END AS Banned
FROM Students s
LEFT JOIN Banned b
    ON s.ID = b.StudentID;

enter image description here

Демо

Обратите внимание, что это своего рода противоположность тому, что делает функция COALESCE.COALESCE проверяет значение и возвращает альтернативу, если это значение будет NULL.Приведенное выше выражение CASE для токена проверяет, является ли значение не NULL, и возвращает NULL в этом случае, в противном случае выявляется вечное значение токена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...