ホームページ >データベース >mysql チュートリアル >MySQL の DELETE ステートメントのサブクエリ制限を回避するにはどうすればよいですか?
MySQL の DELETE ステートメントのサブクエリ制限のナビゲート
MySQL の DELETE
ステートメントは、WHERE
句のサブクエリとともに使用すると、「SQL 構文にエラーがあります...」エラーをスローすることがあります。 この制限は、サブクエリ内のターゲット テーブルの参照に関する MySQL の制限から生じます。
クエリと構文エラーの例
サブクエリ条件に基づいて 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>
MySQL では、サブクエリの term_hierarchy
句内で削除されるテーブル (WHERE
) を使用することが許可されていないため、このクエリは失敗します。
解決策: ネストされたサブクエリ
解決策はサブクエリをネストすることです:
<code class="language-sql">DELETE FROM term_hierarchy AS th WHERE th.parent = 1015 AND th.tid IN ( SELECT id FROM (SELECT DISTINCT(th1.tid) AS id FROM term_hierarchy AS th1 INNER JOIN term_hierarchy AS th2 ON (th1.tid = th2.tid AND th2.parent != 1015) WHERE th1.parent = 1015) x );</code>
解決策の説明
元のサブクエリ (SELECT DISTINCT(th1.tid)
) を別のサブクエリ (SELECT id FROM (...)
) 内にカプセル化することで、一時的な派生テーブル (x
) を作成します。 これにより、MySQL は DELETE
ステートメントの WHERE
句でこの一時テーブルを安全に使用できるようになり、元の制限を効果的に回避できるようになります。
概要
MySQL は DELETE
ステートメントでのサブクエリの使用に制限を課しますが、このネストされたサブクエリ手法は、標準の構文規則によってブロックされる複雑な削除操作を実行するための実用的な回避策を提供します。
以上がMySQL の DELETE ステートメントのサブクエリ制限を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。