1

delete ステートメントには、対応する select 以外の制限があるのはなぜですか?

問題は回避するのに十分簡単だったので、私は立ち往生していませんが、回避策を使用し続けるよりも理解を修正したいと思います。

適切な例として、フィールド V1 と V2 を持つ無向のエッジ リストがあります。残念ながら、テーブルを作成するときに重複を導入しました (つまり、V1 -> V2 および V2 -> V1)。重複を特定するために、次のクエリを実行しました。

SELECT t1.V1, t1.V2
FROM table t1
WHERE t1.V1 > t1.V2
    and EXISTS (
        SELECT *
        FROM table t2
        WHERE t2.V1 = t1.V2
          and t2.V2 = t1.V1 )

これはテーブルから適切な行のセットを返したので、選択行を削除に置き換えて同じクエリを再実行できるはずだと思いました。ただし、SQLサーバーは怒って、代わりに赤い文字をくれました。構文について一度、微調整の後、マルチパート識別子のバインドについて何か。

選択をテーブル変数に保存し、削除を実行することができました。これは問題ありませんが、元のアプローチのどこが間違っていたのでしょうか。単一の SQL ステートメントでそれを実行できたでしょうか?

4

2 に答える 2

4

SQL Server は、かなり柔軟deleteです。doublefrom構文は、ほとんどどこでも使用できselectます。

DELETE FROM t1
FROM table t1
WHERE t1.V1 > t1.V2
    and EXISTS (
        SELECT *
        FROM table t2
        WHERE t2.V1 = t1.V2
          and t2.V2 = t1.V1 )
于 2013-04-29T18:01:49.617 に答える
1

これに似た構文が必要になると思います。

delete from yourTable
where v1 in 
(select v1
 from etc
) 
于 2013-04-29T17:55:51.017 に答える