Oracle 11のFULL OUTER JOINの奇妙な動作に気付きました。私はHRスキーマ、特にEMPLOYEESとDEPARTMENTSからテーブルを結合していました。 - 私はselect句で特定の列のセットを入れたときに、クエリが122行(Aを返しますOracleの完全外部結合の異常な動作 - どのように説明できますか?
SELECT * FROM employees e
FULL JOIN departments d ON e.department_id = d.department_id
しかし、理解するのが難しいものです。たとえば、次のクエリは、123行を返す
行が欠落すると、割り当てられた部門を持たない従業員のためである - さらに左に返される1は内部結合と比較して参加):私は、行を数える場合でも
SELECT first_name, last_name, department_name FROM employees e
FULL JOIN departments d on e.department_id = d.department_id
それは122(COUNT(*)
)を返します!!!何が起こっている? SELECT *
とSELECT COUNT(*)
の違いは何ですか?
SELECT * ...
のための計画を説明します。
SELECT STATEMENT 122
VIEW VW_FOJ_0 122
HASH JOIN FULL OUTER 122
Access Predicates
E.DEPARTMENT_ID = D.DEPARTMENT_ID
TABLE ACCESS DEPARTMENTS FULL 27
TABLE ACCESS EMPLOYEES FULL 107
とSELECT COUNT(*) ...
用:
SELECT STATEMENT 1
SORT AGGREGATE 1
VIEW VW_FOJ_0 122
HASH JOIN FULL OUTER 122
Access Predicates
E.DEPARTMENT_ID = D.DEPARTMENT_ID
INDEX DEPT_ID_PK FAST FULL SCAN 27
INDEX EMP_DEPARTMENT_IX FAST FULL SCAN 107
あなたは、これらの列のための 'union'を使用している場合はどうなりますか:これらの例はかなりの数では、この問題を回避するには、「ネイティブ」完全外部この文を使用して、現在のセッションのために行うことができ、参加し無効にすることです? 'union all'を使うときに何か違うものを得ますか?あなたが 'group by first_name、last_name、department_name'と数えれば何が得られますか? –
'SELECT * FROM従業員e FULL JOIN部署d on e.department_id = d.department_id'は123行を返し、従業員からのSELECT件数(*)はe部署の全部署dはe.department_id = d.department_id'で122行を返しますか? –
はい、まさにこの質問を投稿した理由です。 –