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

OracleCONNECTBYとの混同

    CONNECT BYの方法 クエリが実行され、評価されます-ステップバイステップ(例)。

    次のテーブルとクエリによる接続があるとします。

    select * from mytable;
    
             X
    ----------
             1 
             2 
             3 
             4 
    
    SELECT level, m.* 
    FROM mytable m
    START with x = 1
    CONNECT BY PRIOR x +1 = x  OR  PRIOR x + 2 = x 
    ORDER BY level;
    

    ステップ1:

    テーブルmytableから行を選択します START WITHを満たす 条件として、返された結果セットにLEVEL =1を割り当てます:

     CREATE TABLE step1 AS
     SELECT 1 "LEVEL", X from mytable
     WHERE x = 1;
    
     SELECT * FROM step1;
    
             LEVEL          X
        ---------- ----------
                 1          1
    

    ステップ2

    レベルを1上げる:

    LEVEL = LEVEL + 1
    

    前の手順で返された結果セットをmytableで結合します CONNECT BYを使用する 結合条件としての条件。

    この句では、PRIOR column-name 前の手順で返された結果セットを参照し、単純なcolumn-name mytableを指します テーブル:

    CREATE TABLE step2 AS
    SELECT 2 "LEVEL", mytable.X from mytable
    JOIN step1 "PRIOR"
    ON "PRIOR".x +1 = mytable.x or  "PRIOR".x + 2 = mytable.x;
    
    select * from step2;
    
         LEVEL          X
    ---------- ----------
             2          2 
             2          3
    

    ステップx+1

    最後の操作で空の結果セットが返されるまで、#2を繰り返します。

    ステップ3

    CREATE TABLE step3 AS
    SELECT 3 "LEVEL", mytable.X from mytable
    JOIN step2 "PRIOR"
    ON "PRIOR".x +1 = mytable.x or  "PRIOR".x + 2 = mytable.x;
    
    select * from step3;
    
         LEVEL          X
    ---------- ----------
             3          3 
             3          4 
             3          4
    

    ステップ4

    CREATE TABLE step4 AS
    SELECT 4 "LEVEL", mytable.X from mytable
    JOIN step3 "PRIOR"
    ON "PRIOR".x +1 = mytable.x or  "PRIOR".x + 2 = mytable.x;
    
    select * from step4;
    
         LEVEL          X
    ---------- ----------
             4          4 
    

    ステップ5

    CREATE TABLE step5 AS
    SELECT 5 "LEVEL", mytable.X from mytable
    JOIN step4 "PRIOR"
    ON "PRIOR".x +1 = mytable.x or  "PRIOR".x + 2 = mytable.x;
    
    select * from step5;
    
    no rows selected
    

    ステップ5は行を返さなかったので、クエリを完成させます

    最後のステップ

    UNION ALL すべてのステップの結果を返し、最終結果として返します:

    SELECT * FROM step1
    UNION ALL
    SELECT * FROM step2
    UNION ALL
    SELECT * FROM step3
    UNION ALL
    SELECT * FROM step4
    UNION ALL
    
    SELECT * FROM step5;
    
         LEVEL          X
    ---------- ----------
             1          1 
             2          2 
             2          3 
             3          3 
             3          4 
             3          4 
             4          4 
    

    次に、上記の手順をクエリに適用しましょう。

    SELECT * FROM dual;
    
    DUMMY
    -----
    X 
    
    SELECT LEVEL FROM DUAL CONNECT BY rownum>5;
    

    ステップ1

    クエリにSTART WITHが含まれていないため 句、Oracleはソーステーブルからすべてのレコードを選択します:

    CREATE TABLE step1 AS
    SELECT 1 "LEVEL" FROM dual;
    
    select * from step1;
    
         LEVEL
    ----------
             1 
    

    ステップ2

    CREATE TABLE step2 AS
    SELECT 2 "LEVEL" from dual
    JOIN step1 "PRIOR"
    ON rownum > 5
    
    select * from step2;
    
    no rows selected
    

    最後のステップで行が返されなかったため、クエリを完成させます。

    最後のステップ

    SELECT * FROM step1
    UNION ALL
    
    SELECT * FROM step2;
    
         LEVEL
    ----------
             1
    

    最後のクエリの分析:

    select level from dual connect by rownum<10;
    

    宿題としてお任せします。



    1. Nullを使用したSQLServer文字列の連結

    2. pg-promiseで親と子のツリーを取得します

    3. クラウド内のMySQL-AmazonRDSから独自のサーバーへのオンライン移行:パート2

    4. MySQLで日付から月を取得する方法