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