2011-03-07 56 views
0

我有2008年的SQL Server兩個SQL表:SQL查詢來定位冗餘數據行

GameData 

GameID PK 
GameReleaseDate 
GameTitle 
GameCoverClobID FK 


GameClob 

GameCoverClobID PK 
Filename 

所以隨着時間的推移蓋更新和諸如此類的東西,作爲一個結果,我在GameClob幾個項目有GameData中沒有匹配的ID現在是有效的冗餘數據。我希望能夠刪除這些項目,但是我想知道是否有可以運行的SQL查詢,這隻會向我顯示GameClob中的GameData表中沒有GameCoverClobID的行。

我希望我已經正確地解釋了這個,有任何問題請問。

欣賞它!

+3

之間的外鍵你應該看看這篇文章@Quassnoi:HTTP:// explainextended。 com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/ – Lamak 2011-03-07 14:47:09

回答

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) 
+0

+1 - 好點。 – JNK 2011-03-07 14:39:09

+0

'NOT IN'假設'gamedata.GameCoverClobID'不是'NULL',應該與'NOT EXISTS'完全相同的計劃。 – 2011-03-07 15:27:00

+0

@Martin同意,儘管我更喜歡使用EXISTS(),因爲它「始終」起作用。 'LEFT JOIN'解決方案需要額外的'Filter'來獲得結果。 – 2011-03-08 10:28:22

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

我相信你想改變WHERE子句來使用GameCoverClobID。 – squillman 2011-03-07 14:33:18

+0

謝謝squillman。 – Thyamine 2011-03-07 14:39:20

0

LEFT JOIN應該比NOT IN快...

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

感謝沒有理由的未歸因downvote! – JNK 2011-03-07 15:04:05

+0

可能是因爲你對速度的斷言與評論中的鏈接完全矛盾! – 2011-03-07 15:29:16

+0

@Martin - 剛剛閱讀,其實:)我的斷言是基於經驗,但我認爲在OP的情況下,我會錯。 – JNK 2011-03-07 15:39:56