ホームページ >データベース >mysql チュートリアル >構文エラーを回避するために MySQL DELETE ステートメントでサブクエリを正しく使用する方法

構文エラーを回避するために MySQL DELETE ステートメントでサブクエリを正しく使用する方法

Susan Sarandon
Susan Sarandonオリジナル
2025-01-10 18:01:44145ブラウズ

How to Correctly Use Subqueries in MySQL DELETE Statements to Avoid Syntax Errors?

条件としてサブクエリを使用する 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。