[英]SQL Case Query with n-to-m relationship
我正在處理一個 500 行 SQL 查詢,所以我將嘗試使用一個更簡單的示例....
假設我有一個包含Book_id
、 Author
和Title
列的Books
表,一個包含出版商信息的表Publisher
和一個包含Book_id
、 Title
和Language
列的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
。 如何從可以包含同一本書多次或不包含同一本書的表格中獲得西班牙語列中的真實值?
學習使用正確的、明確的、標准的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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.