2016-11-18 63 views
0

假设我有这个数据库方案:SQL:如何声明一个集合中的元素不能出现在另一个集合中?

schema

我一直磕磕绊绊对这个问题的一个多小时: “选择其中的任何音轨播放列表中所采用的所有专辑。”

我想要做这样的事情:

SELECT parentalbum.albumid FROM album AS parentalbum 
    INNER JOIN track 
    ON track.albumid = parentalbum.albumid 
    INNER JOIN playlistitem 
    ON track.trackid = playlistitem.trackid   // Join the 3 tables 
    WHERE NOT ((SELECT track.trackid FROM album 
       INNER JOIN track 
        ON album.albumid = track.albumid 
       WHERE track.albumid = parentalbum.albumid) // Select songs from one album 
      IN playlistitem.trackid )     // Check if at least one element of the album is in a playlist? (faulty) 

我的查询可能是完全错误的,所以我希望得到任何帮助。

编辑:我忘了提及,我被要求解决这个使用相关的子查询。谢谢!

+0

您正在使用哪些DBMS? –

回答

1

NOT EXISTS()是答案:

SELECT *  -- Select all albums 
FROM album a 
WHERE NOT EXISTS (  -- of which no track 
    SELECT * FROM track t 
    WHERE t.albumid = a.albumid 
    AND EXISTS (
     SELECT * FROM playlistitem pi -- has been used in a playlist 
     WHERE pi.trackid = t.trackid  
     ) 
    ) 
     ; 

更简单:

它使用相关子查询,但不使用 NOT EXISTS,只是因为
SELECT *  -- Select all albums 
FROM album a  
WHERE NOT EXISTS (  -- of which no track 
     SELECT * 
     FROM track t -- has been used in a playlist 
     JOIN playlistitem pi ON t.trackid = pi.trackid 
     WHERE t.albumid = a.albumid 
     ) 
     ; 
1

使用left join来松散地连接表格。然后由相册组,并采取只在playlistitem

select a.id, a.title 
from album a 
left join track t on t.albumid = a.albumid 
left join playlistitem pi on pi.trackid = t.trackid 
group by a.id, a.title 
having sum(case when pi.trackid is not null then 1 else 0 end) = 0 
+0

谢谢,但是练习特别要求使用相关的子查询(将编辑问题) - 我该如何解决这个问题? – Gloomy

0

首先那些具有零个轨道创建,其具有一个内连接来连接在一起地连接的轨道和playlistitem所有结果的子查询。然后检查albumid是否不在该列表中。我使用distinct来获取子查询中唯一的albumid值。

SELECT a.albumid 
FROM album a 
WHERE a.albumid NOT IN 
( SELECT DISTINCT t.albumid 
    FROM track t 
    INNER JOIN playlistitem p 
    ON p.trackid = t.trackid 
) 
+0

不幸的是,这个答案似乎并没有使用相关的子查询,这就是所要求的。 – mendosi

+0

如果相关的子查询是必要的,那么最好的答案是使用NOT EXISTS(),如其他答案中所述。 – Alexandervc

+0

'distinct'是**不是**函数 - 在圆括号之间放置一列完全没用 –

0

替代版本...

Select a.* 
    From Album As a 
    Where 0 = (
    Select Count(*) 
     From PlaylistItem As pi 
     Join Track As t on pi.TrackID = t.TrackID 
     Where t.AlbumID = a.AlbumID); 
相关问题