Sqlite

如何在另一個表中找到具有完全匹配關係的行

  • January 9, 2022

這裡是 SQL 初學者,請多多包涵。

假設我有一個songs看起來像這樣的簡化表

我也有一張桌子songartists

假設我要查找 和 的歌曲K/DASeraphine這意味著沒有隻有兩位藝術家中的一位的歌曲,也沒有包含這兩位藝術家以及其他藝術家的歌曲。

這是一些在技術上可以滿足我要求的程式碼,但速度很慢:

SELECT title FROM songs WHERE
   EXISTS (SELECT * FROM songartists WHERE songartists.song_id == songs.id and songartists.artist == "K/DA")
   AND
   EXISTS (SELECT * FROM songartists WHERE songartists.song_id == songs.id and songartists.artist == "Seraphine")
   AND
   NOT EXISTS (SELECT * FROM songartists WHERE songartists.song_id == songs.id AND songartists.artist NOT IN ("K/DA","Seraphine"))

顯然,我也可以對標題進行非常簡單的查找,然後對藝術家進行比較並以程式方式進行比較。但是有沒有一個高性能的 SQL 解決方案呢?

您可以通過為每個所需的藝術家添加一個內部聯接和另一個聯接來排除除 2 個所需值之外的任何其他值來做到這一點。這第三個將是一個左連接,並且需要一個期望歌曲 id 為空的 where 條件(我假設歌曲表沒有空 id):

select s.*
from songs as s
inner join songartists as sa_k on sa_k.song_id = s.id and sa_k.artist = 'K/DA'
inner join songartists as sa_s on sa_s.song_id = s.id and sa_s.artist = 'Seraphine'
left join songartists as sa_others on sa_others.song_id = s.id and sa_others.artist not in ('K/DA', 'Seraphine')
where sa_others.song_id is null

編輯:我看到你剛剛編輯了你的文章。這個建議的解決方案總是提供在songartists 和songartists.title 上存在適當的索引將是最佳的,只需要3 個表搜尋songartists 和1 個搜尋歌曲。

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