ホームページ >データベース >mysql チュートリアル >構文エラーを回避するために MySQL DELETE ステートメントでサブクエリを正しく使用する方法
条件としてサブクエリを使用する MySQL DELETE ステートメント
MySQL では、DELETE ステートメントを使用して、指定された条件に基づいてテーブルから行を削除できます。一般的な状況は、サブクエリを使用して条件を定義することです。ただし、これを実行しようとすると構文エラーが発生してイライラすることがあります。
ユーザーが次のクエリを使用して term_hierarchy テーブルから行を削除しようとしました:
<code class="language-sql">DELETE FROM term_hierarchy AS th WHERE th.parent = 1015 AND th.tid IN ( SELECT DISTINCT(th1.tid) FROM term_hierarchy AS th1 INNER JOIN term_hierarchy AS th2 ON (th1.tid = th2.tid AND th2.parent != 1015) WHERE th1.parent = 1015 );</code>
ただし、これにより次のエラーが発生しました:
<code>You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS th WHERE th.parent = 1015 AND th.tid IN ( SELECT DISTINCT(th1.tid) FROM ter' at line 1</code>
ここでの問題は MySQL の制限です。削除されるテーブル (この場合は term_hierarchy) は、条件のサブクエリで使用することができません。この制限により、DELETE ステートメントでテーブルを自己参照することができなくなります。
解決策:
この制限を回避するには、削除するテーブルを含めずにサブクエリを参照するネストされたサブクエリを使用できます。次の変更されたクエリはこれを示しています:
<code class="language-sql">DELETE e.* FROM tableE e WHERE id IN (SELECT id FROM (SELECT id FROM tableE WHERE arg = 1 AND foo = 'bar') x);</code>
サブクエリを別のサブクエリ (この例では x という名前) でラップすることにより、MySQL は自己参照制限に違反することなく削除操作を実行できます。
以上が構文エラーを回避するために MySQL DELETE ステートメントでサブクエリを正しく使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。