リファレンスガイド> TDV SQLのキーワードと構文> WITH
 
WITH
SQLクエリの先頭で使用されるWITH句は、メインクエリや他のWITHステートメントで物理テーブルであるかのように参照できる集計を定義します。
WITHステートメントを使用して、共通テーブル式(CTE)を作成できます。 CTEは、単一のSELECT、INSERT、UPDATE、DELETE、またはCREATEVIEWステートメントの実行スコープ内で定義される一時的な結果セットと考えることができます。 CTEはオブジェクトとして保存されず、クエリの期間中のみ存続します。
構文
WITH queryName AS (query expression)
[ , ...]
mainQueryExpression
備考
WITH句は、兄弟のWITH定義を参照することもできます(以下の2番目の例)。
最初にクエリ式に名前を付け、それを参照することでメインのクエリ式内で使用できます。式が複数回出現する場合や複雑な場合は、表現を移動するとわかりやすくなります。
WITHクエリは1回実行され、結果は一時テーブルに相当するものに保存されます。このテーブルは、結果が使用されるたびにスキャンされます。特定の種類のクエリの場合、このスキャンによりデータソースの負担を軽減できます。
次の列を持つ従業員データを返すWebサービスがあるとします。
employeeNo(従業員の番号)
employeeName(従業員の名前)
マネージャー(従業員のマネージャーの従業員番号)
次のクエリは、すべての従業員とそれぞれのマネージャーの詳細を一覧表示します。
WITH us_employees AS
(SELECT employeeNo, emplyeeName, manager FROM employee_webservice WHERE country = 'US')
SELECT e.employeeNo, e.employeeName, 'works for', e.manager,
'who is', m.employeeNo, m.employeeName
FROM us_employees e, us_employees m
WHERE e.manager = m.employeeNo
 
このシナリオでWITHを使用する利点は、Webサービスを1回だけ呼び出すことです。これにより、クエリの実行パフォーマンスが向上します。
例(相互に参照しない2つのWITH句)
次の例では、XとYは相互に参照しない一意の名前です(つまり、Xの値はYの値と同じではありません)。
WITH
X as (SELECT * From Foo),
Y as (SELECT * From X)
Select * From Y
例(共通テーブル式のWITHステートメント)
次の例は、CTE構造のコンポーネント(式名、列リスト、およびクエリ)を示しています。
WITH Sales_CTE (PersonID, OrderID, Year)
AS
-- Define the CTE query.
(
SELECT PersonID, OrderID, OYEAR(OrderDate) AS Year
FROM Sales.OrderHeader
WHERE PersonID IS NOT NULL
)
-- Define the outer query referencing the CTE name.
SELECT PersonID, COUNT(OrderID) AS Total, Year
FROM Sales_CTE
GROUP BY Year, PersonID
ORDER BY PersonID, Year