SQL サブクエリ (Microsoft Access SQL)
適用先: Access 2013、Office 2013
サブクエリとは、SELECT、SELECT...INTO、INSERT...INTO、DELETE、UPDATE などのステートメントおよび他のサブクエリの中にネストされた SELECT ステートメントのことです。
構文
サブクエリの作成には、次の 3 つの構文のいずれかを使用します。
comparison [ANY | ALL | SOME] (sqlstatement)
expression [NOT] IN (sqlstatement)
[NOT] EXISTS (sqlstatement)
サブクエリには、次の指定項目があります。
パーツ |
説明 |
---|---|
comparison |
式、およびその式とサブクエリの結果とを比較する比較演算子。 |
expression |
サブクエリの結果の検索に使用する式。 |
sqlstatement |
他の SELECT ステートメントと同じ形式と規則に従う SELECT ステートメント。 かっこで囲む必要があります。 |
注釈
サブクエリは、SELECT ステートメントのフィールド リストの中で、または WHERE 句や HAVING 句の中で、式の代わりとして使用できます。 サブクエリでは、SELECT ステートメントを使用して、WHERE 句および HAVING 句の式で評価に使用する 1 つまたは複数の値を取得します。
サブクエリで取得したレコードとの比較結果が真になるレコードをメイン クエリから取得するには、ANY 述語または SOME 述語 (この 2 つは同義) を使用します。 次の例では、値引率 25% 以上で売られた商品よりも単価の高いすべての商品を返します。
SELECT * FROM Products
WHERE UnitPrice > ANY
(SELECT UnitPrice FROM OrderDetails
WHERE Discount >= .25);
サブクエリで取得したすべてのレコードとの比較結果が真になるレコードのみをメイン クエリから取得するには、ALL 述語を使用します。 前の例で ANY を ALL に変更すると、値引率 25% 以上で売られたすべての商品よりも単価の高い商品のみを返します。 つまり、取得されるレコードがさらに限定されます。
サブクエリの中に同じ値を持つレコードのみをメイン クエリから取得するには、IN 述語を使用します。 次の例では、値引率 25% 以上で売られたすべての商品を返します。
SELECT * FROM Products
WHERE ProductID IN
(SELECT ProductID FROM OrderDetails
WHERE Discount >= .25);
逆に、サブクエリの中に同じ値を持つレコードがないレコードのみをメイン クエリから取得するには、NOT IN 句を使用します。
EXISTS 述語 (予約語 NOT を併用することも可能) はサブクエリがレコードを返すかどうかを調べることができるので、True/False の中で使用できます。
サブクエリの中でテーブル名の別名を使用すると、サブクエリの外側にある FROM 句に指定したテーブルを参照することができます。 次の例では、同じ役職の全社員のうち平均以上の給与を受け取っている社員の名前を返します。 また、Employees テーブルに "T1" という別名を与えています。
SELECT LastName,
FirstName, Title, Salary
FROM Employees AS T1
WHERE Salary >= (SELECT Avg(Salary)
FROM Employees
WHERE T1.Title = Employees.Title) Order by Title;
この例では、予約語 AS は省略可能です。
一部のサブクエリは、クロス集計クエリの中で述語 (特に WHERE 句の中の述語) として使用できます。 クロス集計クエリでは、SELECT のリストの中で出力としてサブクエリを使用することはできません。
例
次の使用例では、1995 年の第 2 四半期に注文を出した各得意先の名前および連絡先がリストされます。 SELECT ステートメントの使用例で見つけることができる EnumFields プロシージャを呼び出します。
Sub SubQueryX()
Dim dbs As Database, rst As Recordset
' Modify this line to include the path to Northwind
' on your computer.
Set dbs = OpenDatabase("Northwind.mdb")
' List the name and contact of every customer
' who placed an order in the second quarter of
' 1995.
Set rst = dbs.OpenRecordset("SELECT ContactName," _
& " CompanyName, ContactTitle, Phone" _
& " FROM Customers" _
& " WHERE CustomerID" _
& " IN (SELECT CustomerID FROM Orders" _
& " WHERE OrderDate Between #04/1/95#" _
& " And #07/1/95#);")
' Populate the Recordset.
rst.MoveLast
' Call EnumFields to print the contents of the
' Recordset. Pass the Recordset object and desired
' field width.
EnumFields rst, 25
dbs.Close
End Sub