SQL 具有 n 对 m 关系的案例查询

SQL Case Query with n-to-m relationship

我正在处理一个 500 行的 SQL 查询,所以我将尝试使用一个更简单的示例....

假设我有一个 table Books,它有 Book_idAuthorTitle 列,一个 table Publisher 包含发布者信息和包含 Book_idTitleLanguage 列的 table Translations

我想 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。如何从 table 可以包含同一本书多次或不包含多次的西班牙语专栏中获得 true ?

学习使用正确、明确的标准JOIN语法!我希望您没有使用逗号连接的 500 行代码。

你想要一个 left joincase 表达式:

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;