我在SQL Server 2008上有两个SQL表:
GameData
GameID PK
GameReleaseDate
GameTitle
GameCoverClobID FK
GameClob
GameCoverClobID PK
Filename
因此,随着时间的推移,封面会更新,以及因此,我在GameClob中有几个在GameData中没有匹配ID的项目现在实际上是冗余数据。我希望能够删除这些项目,但我想知道是否有一个我可以运行的SQL查询,它只会显示GameClob中GameData表中没有GameCoverClobID的行。
我希望我已经正确解释了这个问题,请问。
欣赏它!
答案 0 :(得分:2)
select *
from gameclob
where GameCoverClobID not in (select GameCoverClobID from gamedata)
答案 1 :(得分:2)
使用WHERE NOT EXISTS
子句应该比LEFT JOIN
和NOT 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