2011-05-18 74 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