この記事では、SQLの一般的なテーブル式(CTE)が複雑なクエリを単純化する方法について説明します。 CTEは、大きなクエリをより小さな名前の部品に分解することにより、読みやすさと保守性を向上させます。この記事では、サブ征服、demに対するCTEの利点について詳しく説明しています
一般的なテーブル式(CTE)は、単一のSQLステートメントの実行範囲内に存在する一時的な名前付き結果セットです。それらは、 WITH
句を使用して定義され、続いてCTE定義が続き、次にCTEを使用するメインクエリが続きます。これにより、複雑なクエリをより小さくて管理しやすい部分に分解し、読みやすさと保守性を向上させることができます。
例で説明しましょう。 Orders
とCustomers
2つの表があるとします。 「ロンドン」と言う、特定の都市から顧客が掲載したすべての注文を見つけたいと思います。 CTEのない複雑なクエリは次のようになるかもしれません:
<code class="sql">SELECT o.OrderID, o.OrderDate, c.CustomerID, c.CustomerName FROM Orders o JOIN Customers c ON o.CustomerID = c.CustomerID WHERE c.City = 'London';</code>
CTEを使用して、これを簡素化できます。
<code class="sql">WITH LondonCustomers AS ( SELECT CustomerID FROM Customers WHERE City = 'London' ) SELECT o.OrderID, o.OrderDate, c.CustomerID, c.CustomerName FROM Orders o JOIN Customers c ON o.CustomerID = c.CustomerID WHERE c.CustomerID IN (SELECT CustomerID FROM LondonCustomers);</code>
LondonCustomers
CTEは、ロンドンからすべての顧客を選択します。メインクエリは、このCTEを使用して注文をフィルタリングします。このアプローチは、特に複数の結合とフィルターを含むより複雑なクエリの場合、元のシングルクエリアプローチよりも明確で理解しやすいものです。 CTEはクエリを効果的にモジュール化し、デバッグとメンテナンスを容易にします。
CTEとサブクリーリーの両方が同様の結果を達成できますが、CTEはいくつかの利点を提供します。
絶対に! CTEは、特に複雑なクエリに対して、SQLコードの読みやすさと保守性を大幅に向上させます。大規模なクエリを小さくて論理的なユニットに分解することにより、CTEはコードの全体的な構造と組織を改善します。これにより、クエリのロジックを理解し、エラーを特定し、変更を加えることができます。 CTEの記述名を使用すると、読みやすさがさらに向上し、開発者がクエリの各部分の目的をすばやく把握できます。これにより、開発時間の短縮、エラーの減少、およびチームメンバー間のコラボレーションが容易になります。
再帰CTEは、組織チャート、材料請求書、ファイルシステムなどの階層データを処理するための強力なツールです。 CTE定義内で繰り返し自分自身を参照することにより、階層構造を横断することができます。
再帰CTEの構造には2つの部分が含まれます。
組織チャートの例を考えてみましょう。
<code class="sql">WITH RECURSIVE EmployeeHierarchy AS ( -- Anchor member: Select the top-level employees SELECT EmployeeID, ManagerID, EmployeeName, Level = 0 FROM Employees WHERE ManagerID IS NULL UNION ALL -- Recursive member: Join the CTE to itself to get subordinates SELECT e.EmployeeID, e.ManagerID, e.EmployeeName, eh.Level 1 FROM Employees e INNER JOIN EmployeeHierarchy eh ON e.ManagerID = eh.EmployeeID ) SELECT * FROM EmployeeHierarchy;</code>
この再帰CTEは、トップレベルの従業員(マネージャーがいない従業員)から始まります。再帰メンバーは、CTEにEmployees
テーブルに参加して各従業員の部下を見つけ、階層内の各レベルのLevel
を増やします。これは、すべての従業員が結果セットに含まれるまで続きます。 UNION ALL
アンカーと再帰メンバーの結果を組み合わせています。 Level
列は、階層構造を視覚化するのに役立ちます。 AnchorメンバーのWHERE ManagerID IS NULL
トップレベルの従業員のみが最初の選択に含まれることが保証されます。これは、無限の再帰を避けるための重要な部分です。無限のループを防ぐために、常に明確な終了条件があることを忘れないでください。
以上がSQLで一般的なテーブル式(CTE)を使用して複雑なクエリを簡素化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。