sql >> データベース >  >> RDS >> Oracle

Oracle、Connect By rownum

    クロコディルコの答えの説明は単に間違っています。あなたは「正解」マークと多数の賛成票を無視するかもしれません、それはまだ間違っています。説明が間違っていることを証明するケースを彼が演習として残したのは興味深いことです。

    CONNECT BY クエリは「あたかも」新しいテーブル(またはSELECTの新しい出力行セット)として機能しません とにかく、ステートメント)は各ステップで生成されます。これは議論の誤りです。

    むしろ、1つしかありません 全体的に(すべてのステップで)生成された行セット。前のステップで生成された行に基づいて新しい行が追加されるのは事実です。ただし、行セット自体は1つであり、個別の行セットではなく、成長しています。

    これは、ROWNUMに関して特に関係があります。 。 ROWNUM 1から始まる単一の「結果」行セットの行に割り当てられます。CONNECT BY クエリでは、行セットは1つだけで、ROWNUM 昇順で1からnになります。

    クロコディルコの答えが正しければ、ROWNUM 各ステップで1から再開します。これは明らかにそうではありません。「標準の」階層クエリで試してみましょう。

    select     empno, ename, mgr, level, rownum
    from       scott.emp
    start with mgr is null
    connect by prior empno = mgr
    ;
    
         EMPNO ENAME             MGR      LEVEL     ROWNUM
    ---------- ---------- ---------- ---------- ----------
          7839 KING                           1          1
          7566 JONES            7839          2          2
          7788 SCOTT            7566          3          3
          7876 ADAMS            7788          4          4
          7902 FORD             7566          3          5
          7369 SMITH            7902          4          6
          7698 BLAKE            7839          2          7
          7499 ALLEN            7698          3          8
          7521 WARD             7698          3          9
          7654 MARTIN           7698          3         10
          7844 TURNER           7698          3         11
          7900 JAMES            7698          3         12
          7782 CLARK            7839          2         13
          7934 MILLER           7782          3         14
    



    1. MySQLの命名規則、フィールド名にはテーブル名を含める必要がありますか?

    2. Mysqlコネクタ-MultipleActiveResultSetsの問題

    3. Dockerコンテナ内のPostgreSQLの権限の問題

    4. mySQLでカスタムORDERBYオーダーを定義する方法