2011-05-18 50 views
0

我正在學習SQL,並且在構建查詢時遇到問題,找不到任何材料來解決此問題。我會在專輯/曲目數據庫中解釋它。SQL查詢多對多衝突問題

因此,這裏是

http://imageshack.us/photo/my-images/194/diagramtt.png/

和我想做的事:

http://imageshack.us/photo/my-images/803/selectwithwhere.png/

我相信答案是顯而易見的,但它確實讓我頭疼。

的Mariusz


(由ypercube編輯):

我大膽猜測是,OP想顯示這些Albums沒有Trackname'UnwantedTrackName'存在所有AlbumsTracks

+0

你想要什麼進一步的過濾條件? – 2011-05-18 13:06:08

+0

您想要的結果中包含哪個TrackName? – CharithJ 2011-05-18 13:06:28

+0

我想要所有沒有跟蹤名稱爲「Sometrack1」的專輯,這意味着在這種情況下只有專輯3 – Mariusz 2011-05-18 13:11:19

回答

3

試試這個:

select 
a.* 
from Album as a 
where a.Album_Id not in 
(
    select 
    at.Album_Id 
    from AlbumTrack as at 
     join Track as t 
     on t.Track_Id = at.Track_Id 
    where t.TrackName ='SomeTrack1' 
) 
+0

我只是發佈這個答案。好的電話 – 2011-05-18 13:29:20

+0

Thx先生=]它正在工作,但不是'Sometrack%',我必須提供'Sometrack1'的資源。現在我必須在NHibernate中實現^ ^,所以手指弄壞了傢伙。 – Mariusz 2011-05-18 13:30:15

+0

在'[NOT] IN'操作中不需要'DISTINCT' - 如果優化器感覺密集,它實際上可能會減慢查詢速度。 – 2011-05-18 13:31:48

0

這是不是很清楚你問什麼,但會「內部加入」給你你想要的?

0

嘗試INNER加入軌道表。如果不工作,推動WHERE條件爲ON子句 - 像

track AS t ON (t.id = at.TrackID AND t.TrackName != 'UnwantedTrackName') 
+0

這是好的情況,但想象一下,如果我將有1000專輯=] – Mariusz 2011-05-18 13:14:47

+0

我已經重寫了答覆 - 請看看解決方案的工作你 – 2011-05-18 13:24:42

+0

這與你編輯的結果是一樣的:) – Mariusz 2011-05-18 13:26:25

1

會爲我們輕鬆很多,如果你在你的包含的代碼和你的結果問題,而不是強迫我們重新輸入。

你想要的所有專輯和曲目,對於不包括一個特定的軌道全部相冊:

select 
    a.AlbumName,t.TrackName 
from 
    Album a 
     inner join 
    AlbumTrack at 
     on 
      a.ID = at.AlbumID 
     inner join 
    Track t 
     on 
      at.TrackID = t.ID 
     left join 
    AlbumTrack at_anti 
     inner join 
    Track t_anti 
     on 
      at_anti.TrackID = t_anti.TrackID and 
      t_anti.TrackName = 'Unwanted Track' 
     on 
      at.AlbumID = at_anti.AlbumID 
where 
    at_anti.TrackID is null 
+0

它顯示出像第一張照片一樣的完整結果。但是,謝謝你試圖幫助我。 – Mariusz 2011-05-18 13:33:49

+0

@Mariusz - 你是否將'Unwanted Track'重命名爲'Sometrack1'? – 2011-05-18 13:49:37

+0

是的,我改名爲Sometrack1 – Mariusz 2011-05-18 13:53:06