私はいつも式を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
を考えてください 定数の時点で、すべての行が検索されます。