簡體   English   中英

SQL 具有 n 對 m 關系的案例查詢

[英]SQL Case Query with n-to-m relationship

我正在處理一個 500 行 SQL 查詢,所以我將嘗試使用一個更簡單的示例....

假設我有一個包含Book_idAuthorTitle列的Books表,一個包含出版商信息的表Publisher和一個包含Book_idTitleLanguage列的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 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM