SQL 具有 n 对 m 关系的案例查询
SQL Case Query with n-to-m relationship
我正在处理一个 500 行的 SQL 查询,所以我将尝试使用一个更简单的示例....
假设我有一个 table Books
,它有 Book_id
、Author
和 Title
列,一个 table Publisher
包含发布者信息和包含 Book_id
、Title
和 Language
列的 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 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;
我正在处理一个 500 行的 SQL 查询,所以我将尝试使用一个更简单的示例....
假设我有一个 table Books
,它有 Book_id
、Author
和 Title
列,一个 table Publisher
包含发布者信息和包含 Book_id
、Title
和 Language
列的 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 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;