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

CONNECTBYクエリでPRIORがどちらの方向に進むべきかをどのように覚えていますか

    私はいつも式をJOINに入れようとします 次の順序で:

    joined.column = leading.column
    

    このクエリ:

    SELECT  t.value, d.name
    FROM    transactions t
    JOIN
            dimensions d
    ON      d.id = t.dimension
    

    「トランザクションごとに、対応するディメンション名を検索する」または「ディメンションごとに、対応するすべてのトランザクション値を検索する」のように扱うことができます。

    したがって、特定のトランザクションを検索する場合は、式を次の順序で並べます。

    SELECT  t.value, d.name
    FROM    transactions t
    JOIN
            dimensions d
    ON      d.id = t.dimension
    WHERE   t.id = :myid
    

    、およびディメンションを検索すると、次のようになります。

    SELECT  t.value, d.name
    FROM    dimensions d
    JOIN
            transactions t
    ON      t.dimension = d.id
    WHERE   d.id = :otherid
    

    以前のクエリでは、おそらく最初に(t.id)でインデックススキャンを使用します。 、次に(d.id )、後者は最初に(d.id)でインデックススキャンを使用します 、次に(t.dimension)で 、クエリ自体で簡単に確認できます。検索されたフィールドは左側にあります。

    JOINでは、駆動テーブルと被駆動テーブルはそれほど明白ではない場合があります。 、しかしそれはCONNECT BYのベルのようにはっきりしています クエリ:PRIOR 行が駆動中、PRIOR以外 駆動されます。

    そのため、このクエリは次のようになります。

    SELECT  *
    FROM    hierarchy
    START WITH
            id = :root
    CONNECT BY
            parent = PRIOR id
    

    parentを持つすべての行を検索する」という意味です 指定されたidです "。このクエリは階層を構築します。

    これは次のように扱うことができます:

    connect_by(row) {
      add_to_rowset(row);
    
      /* parent = PRIOR id */
      /* PRIOR id is an rvalue */
      index_on_parent.searchKey = row->id;
    
      foreach child_row in index_on_parent.search {
        connect_by(child_row);
      }
    }
    

    そしてこのクエリ:

    SELECT  *
    FROM    hierarchy
    START WITH
            id = :leaf
    CONNECT BY
            id = PRIOR parent
    

    idの行を見つける」という意味です 指定されたparentです "。このクエリは祖先チェーンを構築します。

    常にPRIORを入力してください 式の右側にあります。

    PRIOR columnを考えてください 定数の時点で、すべての行が検索されます。



    1. 日時またはタイムスタンプを使用するタイミング

    2. postgresを使用して個別の行データを列にピボット/クロスします

    3. キー->値データ用の優れた高速永続ストレージオプションは何ですか?

    4. PostgresSQL 9.5のインストールに失敗しました:「データベースクラスターの初期化に失敗しました」MAC os(big sur 11.4)