2011-12-23 36 views
2

両方ともID番号がリンクされた2つのテーブルがあります(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を試しましたが、遅すぎました。私は上記の2つのテーブルを直接比較しているので、効率的でなければなりません。

EDITを(私が個別に各テーブルの制御を必要とするようカスケードを使用したくない) - SELECTステートメントが正しく欠落しているIDを返すので、DELETE FROM AllUsers WHERE EXISTS部分に何か問題があります。

答えて

1

あなたは基本的には、データを返す場合、それはすべてのデータを削除します...唯一の条件は、boolean型であるため、

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

あなたの元のクエリは、テーブル全体を削除します言っています。 exists句でデータが返されない場合、データは削除されません。

あなたは(私はCEでない流暢なんだけど、それはCEに100%のトランスポートを経由しない場合は、マイナーな修正を行うことができるはずです)このような何かをしたい:

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

私が使用して嫌いに。 SQL-CEは既存のものを使用できますか? – MatBailie

+0

@Demsなぜあなたは 'IN'を嫌うの??? :) SQL CEに関しては、私は本当にいずれかの方法を言うことはできません。私がSQL CEの専門家であると言えば、私は嘘をついていただろう(あるいは軽度の詩でさえ)。 –

+0

代替案よりも最適化されていないことがよくあります。そして、JOINできない人たちによって過度に使用されています。人々は '@(@comma_delimited_string_of_chaff)'を試してみましょう。また、最大サイズのデータ​​セットに制限されることもあります。そしてそれはちょうどperrrrrrtyではありません。 – MatBailie

関連する問題