2

次のデータを使用して、両方のテーブルから一致するレコードを削除しようとしています。

果物

ID 値
1 りんご
2 なし
3 バナナ
4 ぶどう

動物

ID 値
1 くま
2 さる
3 りんご
4 ぶた

これら 2 つのテーブル間に定義された関係はありません。

「Apple」は両方の表に出てくるので、それぞれからこのレコードを削除したいと思います。

これを達成するために、次のクエリを試しました。

DELETE DISTINCTROW Animals.*, Fruits.*
FROM Animals INNER JOIN Fruits ON Animals.Value = Fruits.Value;

ただし、これを実行すると、次のエラーが表示されます。

指定されたテーブルから削除できませんでした。

私は何を間違っていますか? これを修正するにはどうすればよいですか?

4

1 に答える 1

4

カスケード削除を利用するための関係を確立しないと、うまくいきません。DELETE ステートメントは、一度に 1 つのテーブルに対して機能します (カスケード削除がある場合は、バックグラウンドで実行されます)。やりたいことを実現するためには、何かを工夫するしかありません。おそらく、マクロを介して、次のような単純なことを行うことができます。

UPDATE Animals, Fruits SET Animals.Value="DELETED", Fruits.Value="DELETED" WHERE Animals.Value=Fruits.Value
DELETE Animals WHERE Animals.Value="DELETED"
DELETE Fruits WHERE Fruits.Value="DELETED"

洗練された VBA マクロ (およびおそらく一時テーブル) を作成することを除けば、これで十分です。

余談ですが、SQL Server や DB2 などのより負荷の高い DB でも実行できるとは思えません。サブクエリまたはビューに対する DELETE では、DB システムがそれを特定のテーブルに解決できる必要があります。

あなたが得たエラーは、(INNER JOIN の結果として) ロックされた行の問題であると推測します。

于 2011-01-26T18:01:44.500 に答える