副選択照会の例
以下の例は、副選択照会について説明しています。
- 例 1: EMPLOYEE 表からすべての列と行を選択します。
SELECT * FROM EMPLOYEE - 例 2: EMP_ACT 表および EMPLOYEE 表を結合し、EMP_ACT 表からすべての列を選択して、EMPLOYEE 表の従業員の姓 (LASTNAME) を結果の各行に追加します。
SELECT EMP_ACT.*, LASTNAME FROM EMP_ACT, EMPLOYEE WHERE EMP_ACT.EMPNO = EMPLOYEE.EMPNO - 例 3: EMPLOYEE 表と DEPARTMENT 表を結合し、1955 年よりも前に生まれた (BIRTHDATE) 従業員すべての従業員番号 (EMPNO)、従業員の姓 (LASTNAME)、部門番号 (EMPLOYEE 表の WORKDEPT と DEPARTMENT 表の DEPTNO)、および部門名 (DEPTNAME) を選択します。
SELECT EMPNO, LASTNAME, WORKDEPT, DEPTNAME FROM EMPLOYEE, DEPARTMENT WHERE WORKDEPT = DEPTNO AND YEAR(BIRTHDATE) < 1955 - 例 4: EMPLOYEE 表の中で同じジョブ・コードを持つ行のグループごとに、ジョブ (JOB) と給与 (SALARY) の最低額と最高額を選択します。ただし、グループの中でも、複数の行を備えていて、しかも給与の最高額が 27000 以上のグループについてのみ選択を行います。
SELECT JOB, MIN(SALARY), MAX(SALARY) FROM EMPLOYEE GROUP BY JOB HAVING COUNT(*) > 1 AND MAX(SALARY) >= 27000 - 例 5: EMP_ACT 表の中から、部門 (WORKDEPT) 'E11' の従業員 (EMPNO) についてのすべての行を選択します。(従業員部門番号は、EMPLOYEE 表に示されています。)
SELECT * FROM EMP_ACT WHERE EMPNO IN (SELECT EMPNO FROM EMPLOYEE WHERE WORKDEPT = 'E11') - 例 6: EMPLOYEE 表から、給与の最高額が従業員全体の平均給与に満たないすべての部門について、部門番号 (WORKDEPT) と部門別給与 (SALARY) の最高額を選択します。
この例では、HAVING 節の副照会は一度実行されます。SELECT WORKDEPT, MAX(SALARY) FROM EMPLOYEE GROUP BY WORKDEPT HAVING MAX(SALARY) < (SELECT AVG(SALARY) FROM EMPLOYEE) - 例 7: EMPLOYEE 表を使用して、部門別給与の最高額が他のすべての部門の平均給与より少ない部門の部門番号 (WORKDEPT) とその部門別給与 (SALARY) の最高額を選択します。
SELECT WORKDEPT, MAX(SALARY) FROM EMPLOYEE EMP_COR GROUP BY WORKDEPT HAVING MAX(SALARY) < (SELECT AVG(SALARY) FROM EMPLOYEE WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)例 6 とは反対に、HAVING 節の副照会は、各グループごとに実行します。
- 例 8: 営業担当員の従業員番号と給与、およびその部門の給与平均額と人数とを調べます。この照会では、まずネストされた表式 (DINFO) を作成して、AVGSALARY 列と EMPCOUNT 列、 および WHERE 節で使用される DEPTNO 列を入手する必要があります。
SELECT THIS_EMP.EMPNO, THIS_EMP.SALARY, DINFO.AVGSALARY, DINFO.EMPCOUNT FROM EMPLOYEE THIS_EMP, (SELECT OTHERS.WORKDEPT AS DEPTNO, AVG(OTHERS.SALARY) AS AVGSALARY, COUNT(*) AS EMPCOUNT FROM EMPLOYEE OTHERS GROUP BY OTHERS.WORKDEPT ) AS DINFO WHERE THIS_EMP.JOB = 'SALESREP' AND THIS_EMP.WORKDEPT = DINFO.DEPTNOここでは、ネストした表式を使用することによって、 DINFO ビューを通常のビューとして作成する際の処理リソースを節約します。 ステートメントの作成中に、ビューのカタログにはアクセスされません。 これは、照会の残りの部分のコンテキストにより、 ビューによって考慮するのはセールス担当の部門の行だけだからです。
- 例 9: 5 つの従業員のランダム・グループについて平均的な教育レベルと給与を表示します。この照会では、各従業員のランダム値を GROUP BY 節で使用できるようにするために、 ネストした表式を使用してこのランダム値を設定する必要があります。
SELECT RANDID , AVG(EDLEVEL), AVG(SALARY) FROM ( SELECT EDLEVEL, SALARY, INTEGER(RAND()*5) AS RANDID FROM EMPLOYEE ) AS EMPRAND GROUP BY RANDID - 例 10: EMP_ACT 表を照会して、その中の従業員の給与が全従業員の中で上位 10 人に入るプロジェクト番号を戻します。
SELECT EMP_ACT.EMPNO,PROJNO FROM EMP_ACT WHERE EMP_ACT.EMPNO IN (SELECT EMPLOYEE.EMPNO FROM EMPLOYEE ORDER BY SALARY DESC FETCH FIRST 10 ROWS ONLY) - 例 11: PHONES と IDS は同じカーディナリティーの配列値を持つ 2 つの SQL 変数であると想定して、これらの配列を、3 つの列 (各配列に 1 つおよび位置用にもう 1 つ) および各配列エレメントにつき 1 つの行を持つ表に変換します。
SELECT T.PHONE, T.ID, T.INDEX FROM UNNEST(PHONES, IDS) WITH ORDINALITY AS T(PHONE, ID, INDEX) ORDER BY T.INDEX