2011-12-23 91 views
2

我有兩個表都有一個鏈接在一起的ID號(AllUsersAllProfiles)。當用戶按下按鈕時,我希望AllUsers表檢查它所具有的AllProfiles表中不存在的ID並刪除它們。我是SQLCE的新手,並一起攻擊它。問題是,它一直在刪除整個表格。爲什麼?刪除整個表的SQL語句

DELETE FROM AllUsers 
WHERE EXISTS 
    (SELECT  ID 
    FROM   AllUsers 
    WHERE  (ID NOT IN 
        (SELECT ID 
         FROM AllProfiles))) 

此外,這是一種批量刪除數千條記錄的有效方法嗎?我試過Linq的DeleteAllOnSubmit,但速度太慢。我希望自上面直接比較兩個表,它應該是有效的。 (我不想使用級聯,因爲我需要每個單獨的表的控制)

修改 - SELECT語句正確返回缺少的ID,所以有一些錯誤的DELETE FROM AllUsers WHERE EXISTS部分。

回答

1

你基本上說

delete from allusers 
where TRUE -- this is pseudo, but you get the idea 

原始查詢刪除整個表,因爲唯一的條件是布爾...如果返回的數據,然後它會刪除所有數據。如果你的exists子句沒有返回數據,它不會刪除任何數據。

你想是這樣的(我不流利符合CE,但是你應該能夠稍作修改,如果它沒有達到100%運到CE):

delete from allusers 
where id not in 
(
    select id 
    from allprofiles 
) 
+0

我討厭使用在。 SQL-CE可以使用EXISTS嗎? – MatBailie

+0

@Dems你爲什麼討厭'IN' ??! :)至於SQL CE,我不能說任何一種方式。如果我說我是SQL CE專家(或者甚至是輕微的詩句),我會撒謊。 – 2011-12-23 02:45:18

+0

它通常比替代品不太優化。並且被無法加入的人過度使用。並讓人們嘗試'IN(@comma_delimited_string_of_chaff)'。有時僅限於最大尺寸的數據集。這只是不正確。 – MatBailie