我有一个问题,我需要编写一个SQL,该SQL显示重复的PlayistID和PlaylistName以及任何关联的TrackID。
“播放列表”表包含“播放列表ID”和“播放列表名称”列。
PlaylistTrack表包含PlaylistID和TrackID列。
“跟踪”表包含“ TrackID”列。
我唯一想做的就是通过运行下面的代码来查看所有数据,从而向后工作。然后希望隔离出我正在寻找的东西。
看着Stackoverflow,他们建议使用HAVING COUNT(*) > 1
,但对我来说毫无用处。
任何建议将不胜感激。
SELECT *
FROM Playlist P
JOIN PlaylistTrack PP
ON P.PlaylistId = PP.PlaylistId
JOIN Track T
ON PT.TrackId = T.TrackId
结果应为:
上面的输出是我要查找的重复项。我运行了上面的代码,将其复制到excel中,并进行了过滤以查看重复的内容。
答案 0 :(得分:0)
由于您不喜欢HAVING,所以为什么不使用PARTITION ROW_NUMBER。
SELECT * FROM
(
SELECT P.PlaylistID,P.PlaylistName,T.TrackID,dupid=ROW_NUMBER() OVER(PARTITION BY P.PlaylistId,T.TrackId ORDER BY T.TrackId)
FROM Playlist P
JOIN PlaylistTrack PP
ON P.PlaylistId = PP.PlaylistId
JOIN Track T
ON PT.TrackId = T.TrackId
)ax
where dupid>1
答案 1 :(得分:0)
您可以将表的多个副本连接在一起
SELECT pp1.TrackId, p1.PlaylistName, pp1.PlaylistID, p2.PlaylistName, pp2.PlaylistID
FROM Playlist P1
INNER JOIN PlaylistTrack PP1
ON P1.PlaylistId = PP1.PlaylistId
INNER JOIN PlaylistTrack PP2
ON (PP1.PlaylistId != PP2.PlaylistId AND pp1.TrackId = pp2.TrackId)
INNER JOIN Playlist P2
ON P2.PlaylistId = PP2.PlaylistId
ORDER BY pp1.TrackId;
这将为您提供TrackId出现在多个播放列表中的结果。
有一个小问题,您将得到重复的结果,即相反。您会得到:
Trackid Playlist1Id Playlist2Id
3503 8 10
3503 10 8
如果这朝着正确的方向发展,您可以扩展sql以删除重复项。