0

次のコードがあります。

int result = -1;
StringBuilder sb = new StringBuilder();
SqlCommand cmd = MyConnection.
sb.AppendLine("delete from Table1 where ID in");
sb.AppendLine("(select id from Table1 t1 where  not exists(select * from Table2 t2 where t2.Table1ID = t1.ID))");
cmd.CommandText = sb.ToString();
result = cmd.ExecuteNonQuery();
_log.Info("StoredXMLDocument Records Deleted: " + result.ToString());

より読みやすい形式のその SQL は次のとおりです。

delete from Table1 where ID in
(select id from Table1 t1 where  not exists(select * from Table2 t2 where t2.Table1ID = t1.ID))

SQL がデータベースで直接実行された場合、行が削除されないことはわかっています。ただし、このコードを実行すると、結果の値は 1 になります。期待していたのは 0です。Table1 にはトリガーがありません。何か不足していますか?なんで1なの?

補遺:わかりました。データベースでSQLを実行すると、行が削除されます。すべてのテストの前に、この目的のために保存したバックアップからデータベースを復元することに注意してください。今朝も昨日の午後も行が削除されていなかったことを誓います。はい、それはバックアップを復元した後でした。クレイジーな丸薬を使い果たして、今日の午後に問題を再検討します. うまくいけば、より明確な心で。

4

2 に答える 2

1

返されるはず0です。

SELECT COUNT(*) Table1の前後を見比べてみてくださいDELETE

于 2010-05-27T14:17:06.457 に答える
0

補足として、クエリは次のように簡略化できます。

delete from Table1 where ID not in (select Table1ID from Table2)

興味のためにこれを試してください:

delete from Table1 where 1 = 0 --we know this will delete no rows

また、 にトリガーがないか確認してくださいTable1

于 2010-05-27T14:28:10.110 に答える