SQL Case Query с отношением n-to-m - PullRequest
       16

SQL Case Query с отношением n-to-m

2 голосов
/ 24 октября 2019

У меня 500-строчный SQL-запрос, над которым я работаю, поэтому я попытаюсь использовать более простой пример ....

Предположим, у меня есть таблица Books, в которой есть Book_id, *Столбцы 1005 * и Title, таблица Publisher с информацией об издателе и таблица Translations с Book_id, Title и Language столбцами.

Я хочу SELECTвсе книги от определенного издателя, независимо от того, были ли они переведены на испанский язык, но я хочу показать столбец, содержащий true, если у них есть перевод на испанский язык.

Итак, предположим, что мой запросSELECT Author, Title, Spanish FROM Books, Translations WHERE Publisher.Book_id = Books.Book_id AND Translations.Book_id = Books.Book_id AND Publisher_id = 1Как получить истинное значение в испанской колонке из таблицы, которая может содержать одну и ту же книгу несколько раз или ни разу?

1 Ответ

3 голосов
/ 24 октября 2019

Научитесь использовать правильный, явный, стандартный JOIN синтаксис! Я действительно надеюсь, что у вас нет 500 строк кода, использующих запятые для объединений.

Вы хотите выражения left join и case:

SELECT b.Author, b.Title, 
       (CASE WHEN t.Book_id IS NOT NULL THEN 'true' ELSE 'false' END) as spanish_flag
FROM Books b LEFT JOIN
     Translations t
     ON t.Book_id = b.Book_id AND
        t.language = 'Spanish'  
WHERE b.Publisher_id = 1;

Примечание. При этом используетсястроковое представление для 'true' / 'false'. Вы не указали базу данных. Некоторые имеют прямую поддержку логических значений.

На самом деле, предположим, что книга может иметь несколько переводов на один язык. Более естественный способ написания запроса использует EXISTS:

SELECT b.Author, b.Title, 
       (CASE WHEN EXISTS (SELECT 1
                          FROM Translations t
                          WHERE t.Book_id = b.Book_id AND
                                t.language = 'Spanish'
                         ) 
             THEN 'true' ELSE 'false'
        END) as spanish_flag
FROM Books b
WHERE b.Publisher_id = 1;
...