プログラ生活

プログラム初学者のためのポイントを書いていこうと思います。たまに脇道それた記事もありますが、息抜きだとおもって気長にお付き合いください。

【SQL Server(連載)】SELECT文 (サブクエリ) -8-

www.pon-x.jp

前回の続き

今回は、サブクエリを勉強します。
サブクエリとは入れ子ともいわれ、例えば、親のSELECT文の中に子のSELECT文をいれるなどあります。
今回は、このSELECT文を使ったサブクエリを紹介します。

FROM句をサブクエリにする。

前回、HAVINGを紹介しましたが、サブクエリを使うとHAVINGと同様な出力を得ることができます。

ちなみに、前回のクエリはこちら。

SELECT 
    PersonType,
    COUNT(BusinessEntityID)
FROM Person.Person
WHERE MiddleName IS NOT NULL
GROUP BY PersonType
HAVING COUNT(BusinessEntityID) > 100

これと同じ出力になるのはこちら、

SELECT * 
FROM 
    (
        SELECT 
            PersonType,
            COUNT(BusinessEntityID) AS CNT
        FROM Person.Person
        WHERE MiddleName IS NOT NULL
        GROUP BY PersonType
    ) TBL1
WHERE CNT > 100

FROM句に集計した結果のテーブルを作っておいて、このテーブルをTBL1という名前のテーブルとして、扱います。
これにより、集計されたカラムはWHERE句によって、抽出可能になります。

FROM句以外にも使える。

サブクエリはFROM句以外にも、どこでも扱えます。
ためしに、カラムをサブクエリにしてあげます。

SELECT 
    BusinessEntityID,
    (
        SELECT PhoneNumber 
        FROM Person.PersonPhone PPP 
        WHERE PPP.BusinessEntityID = PP.BusinessEntityID
        ) AS PhoneNumber
FROM Person.Person PP

出力は以下の通り
f:id:hanabusa-snow:20201123202719p:plain
2列目カラムについて、Person.PersonPhoneのBusinessEntityIDをキーにしてレコードを抽出し、PhoneNumberを表示します。

サブクエリはテーブルで返せるものと、スカラで返さなくてはならないものの違いがある。

以下はエラーになります。

SELECT 
    BusinessEntityID,
    (
        SELECT PhoneNumber 
        FROM Person.PersonPhone PPP 
        ) AS PhoneNumber
FROM Person.Person PP

f:id:hanabusa-snow:20201123202915p:plain
FROM句に入れるサブクエリと違うのは、カラムとして出力させるうえでは、結果がスカラ(単一)になる必要があります。
上記のSQLでは、複数の結果を返すので、エラーになります。







以上、今回はここまで。