0

MySQL/SQL クエリを試し、複雑なクエリのチュートリアルを学習しています。

以下は、前述のように正常に実行されるクエリですが、結果セットは理解できません。

クエリは、各部門から「2」人の最も高給の従業員を取得します。

SELECT deptno, empno, sal
FROM emp e
WHERE
2 > ( SELECT COUNT(e1.sal)
      FROM emp e1
      WHERE e.deptno = e1.deptno AND e.sal < e1.sal )
ORDER BY 1,3 DESC; 

しかし、この2 >Order by 1,3がクエリで何をするのか理解できません。

クエリを理解するために、次のように WHERE 原因クエリを個別に実行しました。

SELECT COUNT(e1.sal)
          FROM emp e1
          WHERE e.deptno = '1';

上記のクエリは、値が「1」の deptno の数を返しました。

つまり、各部門がカウントされます!!

e.sal < e1.sal??で正確に何が起こるかわかりません 再帰的に実行されていますか?? 最高賃金の従業員を計算するには??

誰かがクエリを理解するのを手伝ってくれますか!

上記のロジックを理解できれば、以下のクエリのロジックを理解できます。

4th Top Salary of all the employees:

SELECT DEPTNO, ENAME, SAL
FROM EMP A
WHERE
3 = (SELECT COUNT(B.SAL) FROM EMP B
WHERE A.SAL < B.SAL) ORDER BY SAL DESC;

フィドルを提供していないことをお詫び申し上げます..

4

1 に答える 1

1

これは相関サブクエリを持つクエリです。

サブクエリが何をしているかをよりよく理解するために、サブクエリを外側の選択に移動して、それが返すものを見ることができます

SELECT deptno, empno, sal,
      ( SELECT COUNT(e1.sal)
          FROM emp e1
         WHERE e.deptno = e1.deptno AND e.sal < e1.sal ) rank
FROM emp e

出力例:

| | DEPTNO | エンプノ | SAL | ランク |
-------------------------------
| | 1 | 103 | 30 | 0 |
| | 1 | 102 | 20 | 1 |
| | 1 | 101 | 10 | 2 |
| | 2 | 201 | 100 | 0 |
| | 2 | 203 | 50 | 1 |
| | 2 | 202 | 40 | 2 |

これがSQLFiddleのデモです

何をするか (外部選択の各レコードに対して) 給与が外部選択で取得された行の給与よりも少ない同じ部門の行の数を返し、給与に基づいてすべての部門のレコードをランク​​付けします。

これは、ルールを効果的に実装するよりもランクが高い行を除外することWHERE 2 > (subquery)と同じです。WHERE (subquery) < 21TOP 2

ORDER BY 1, 3 DESCと同じORDER BY deptno, sal DESCです。1 と 3 は、select 句の列deptnoと列の位置です。sal

于 2013-07-25T10:15:30.970 に答える