web-dev-qa-db-ja.com

Oracleでselectステートメントのサブクエリが機能する仕組み

Select文のサブクエリがどのように機能するかについて説明を探しましたが、非常に曖昧な説明のために概念を理解できません。

Oracleのselectステートメントでサブクエリをどのように使用し、どのように出力するのかを知りたいです。

たとえば、従業員の名前と彼らがこれらのテーブルから管理するプロファイルの数を表示したいクエリがある場合

従業員(EmpName、EmpId)

Profile(ProfileId、...、EmpId)

サブクエリを使用するにはどうすればよいですか?

各従業員について管理されているプロファイルの数をカウントするために、グループごとの機能を実装するには、selectステートメントにサブクエリが必要だと考えていましたが、あまりよくわかりません。

17
user3054901

簡単だ-

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 および 左結合または左外部結合 を参照してください。

26
Rachcha

Oracle RDBMSでは、(サブ)出力がコレクションとしてカプセル化されている限り、select句で複数行のサブクエリを使用できます。特に、複数行のselect句のサブクエリは、各行をxmlforestにカプセル化されたxmlelementとして出力できます。

0
lambdakiki