SQL-如何从两个表中查找重复项?

时间:2019-02-01 05:03:24

标签: sql-server

我有一个问题,我需要编写一个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

结果应为:

  • 播放列表名称-音乐和电视节目
  • 播放列表ID-8和10
  • TrackID = 3503和2819。

上面的输出是我要查找的重复项。我运行了上面的代码,将其复制到excel中,并进行了过滤以查看重复的内容。

2 个答案:

答案 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以删除重复项。