SQL查询多对多关系问题

时间:2011-05-18 13:01:01

标签: sql tsql many-to-many

我正在学习SQL,我在构建查询时遇到问题,而且找不到任何材料来解决这个问题。我将在Album / Tracks数据库中解释它。

所以这是

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

那就是我想要做的事情:

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

我确信答案是显而易见的,但这确实让我很头疼。

马里乌什


(由ypercube编辑):

我的猜测是,OP希望为Albums显示所有TracksAlbums,{strong>不 Trackname 'UnwantedTrackName'存在。

4 个答案:

答案 0 :(得分: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'
)

答案 1 :(得分: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

答案 2 :(得分:0)

目前还不是很清楚你在问什么,但是“INNER JOIN”会给你你想要的东西吗?

答案 3 :(得分:0)

尝试INNER加入曲目表。如果这不起作用,请将WHERE条件推送到ON子句 - 比如

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