SQL Query用于查找冗余数据行

时间:2011-03-07 14:28:50

标签: sql-server

我在SQL Server 2008上有两个SQL表:

GameData 

GameID PK 
GameReleaseDate
GameTitle 
GameCoverClobID FK


GameClob

GameCoverClobID PK
Filename

因此,随着时间的推移,封面会更新,以及因此,我在GameClob中有几个在GameData中没有匹配ID的项目现在实际上是冗余数据。我希望能够删除这些项目,但我想知道是否有一个我可以运行的SQL查询,它只会显示GameClob中GameData表中没有GameCoverClobID的行。

我希望我已经正确解释了这个问题,请问。

欣赏它!

3 个答案:

答案 0 :(得分:2)

select * 
from gameclob 
where GameCoverClobID not in (select GameCoverClobID from gamedata)

答案 1 :(得分:2)

使用WHERE NOT EXISTS子句应该比LEFT JOINNOT IN快,因为它在找到第一条记录时会有快捷方式。

SELECT * 
FROM GameClob gc
WHERE NOT EXISTS (SELECT * 
                    FROM GameData gd 
                   WHERE gc.GameCoverClobID = gd.GameCoverClobID )

为防止将来出现此问题,最好在2个表之间创建一个外键

ALTER TABLE GameClob 
ADD CONSTRAINT fkGameClobGameData 
FOREIGN KEY (GameCoverClobID) 
REFERENCES GameData(GameCoverClobID)

答案 2 :(得分:0)

LEFT JOIN应该比NOT IN ...

SELECT *
FROM gameclob gc
LEFT JOIN gamedata gd
    ON gs.GameCoverClobI = gc.GameCoverClobID
WHERE gd.gameclobid IS NULL