Select文のサブクエリがどのように機能するかについて説明を探しましたが、非常に曖昧な説明のために概念を理解できません。
Oracleのselectステートメントでサブクエリをどのように使用し、どのように出力するのかを知りたいです。
たとえば、従業員の名前と彼らがこれらのテーブルから管理するプロファイルの数を表示したいクエリがある場合
従業員(EmpName、EmpId)
Profile(ProfileId、...、EmpId)
サブクエリを使用するにはどうすればよいですか?
各従業員について管理されているプロファイルの数をカウントするために、グループごとの機能を実装するには、selectステートメントにサブクエリが必要だと考えていましたが、あまりよくわかりません。
簡単だ-
SELECT empname,
empid,
(SELECT COUNT (profileid)
FROM profile
WHERE profile.empid = employee.empid)
AS number_of_profiles
FROM employee;
次のようなテーブル結合を使用すると、さらに簡単になります。
SELECT e.empname, e.empid, COUNT (p.profileid) AS number_of_profiles
FROM employee e LEFT JOIN profile p ON e.empid = p.empid
GROUP BY e.empname, e.empid;
サブクエリの説明:
基本的に、select
のサブクエリはスカラー値を取得し、それをメインクエリに渡します。 select
のサブクエリは、複数の行と複数の列を渡すことができません。これは制限です。ここでは、count
をメインクエリに渡します。これは、わかっているように、常に数値(スカラー値)のみです。値が見つからない場合、サブクエリはnull
をメインクエリに返します。さらに、サブクエリは、employee.empid
が外部クエリから内部クエリに渡される私のクエリで示されているように、メインクエリのfrom
句から列にアクセスできます。
編集:
select
句でサブクエリを使用すると、Oracleは基本的にそれを左ジョインとして扱います(クエリの explain plan で確認できます)。左側の行ごとに右側に1つだけです。
左結合の説明
左結合は、特に制限のためselect
サブクエリを置換する場合に非常に便利です。ここでは、LEFT JOIN
キーワードの両側のテーブルの行数に制限はありません。
詳細については、 サブクエリのOracle Docs および 左結合または左外部結合 を参照してください。
Oracle RDBMSでは、(サブ)出力がコレクションとしてカプセル化されている限り、select句で複数行のサブクエリを使用できます。特に、複数行のselect句のサブクエリは、各行をxmlforestにカプセル化されたxmlelementとして出力できます。