Subquery

比較 M:N 關係中的所有屬性

  • December 20, 2017

我是數據庫開發的新手,我確信我目前的問題很常見。不幸的是,我還沒有找到解決方案 - 主要是因為我不確定如何正確命名它;)所以如果已經有可用的解決方案或者有更好的方法來描述它,請告訴我,我會重命名這個文章。

我的問題是我有一個具有 M:N 關係的數據庫,我正在尋找一種方法來檢查記錄是否已經存在。

例子:

最小範例 ER 模型

書籍可以有多個出版地點和作者。為避免重複,應在添加新書之前檢查數據庫。如果只有一位作者和出版地,則查詢將只返回一條記錄:

在此處輸入圖像描述

但如果有兩個作者,則將返回同一本書的 2 行。更複雜的是,假設有兩本書具有相同的標題、出版年份和頁數,但作者不同,這將被返回:

在此處輸入圖像描述

這就是我的問題開始的地方:我想檢查 book_id 為“2”的記錄是否已經存在(顯然不知道 book_id)以及它的 book_id 是否存在。在此範例中,實現此目的的唯一方法是檢查兩個作者的姓名(或 ID 以使其更短一點)是否與其中一本書相關聯,其中一本書的標題、年份和頁數中具有明確的值 - 而我沒有有任何想法如何做到這一點(最好是在 SQL 中)。

所以提前感謝您的幫助:)

好吧,經過一些實驗和仔細閱讀多個 SQL 教程後,我發現這是一個相當不錯的解決方案:

SELECT DISTINCTROW book_id, title, year_of_publication FROM
((book
INNER JOIN (SELECT * FROM link_author_book 
                INNER JOIN author ON link_author_book.author = author.auth_id
                WHERE author.firstname = "Jeff" AND author.lastname = "Carpenter") AS author
ON author.book = book.book_id)

INNER JOIN (SELECT * FROM link_place_book
                INNER JOIN pub_place ON link_place_book.p_place = pub_place.place_id
                WHERE pub_place.placename = "Sebastopol" OR pub_place.placename = "Tokyo") AS place 
ON place.book = book.book_id)

WHERE title = "Cassandra: The Definitive Guide, 2nd Edition" AND
year_of_publication = 2016 AND pagecount = 370;

這應該完全返回所需的書,而不是其他任何東西。顯然,硬編碼值可以用來自前端表單或其他東西的值替換,以使其更加靈活……歡迎任何優化此解決方案的建議。

引用自:https://dba.stackexchange.com/questions/190150