2016-02-11 14 views
7

次のクエリは、connect byleft joinと組み合わせたselect *がすべての列を返すのではなく、これらの条件で使用される列のみを返します。 この動作は、select *がリリースで使用されるべきではないことを考えると、私にとって役に立ちました。データを要求するのに便利です。他のクエリに対し、Oracle select asterisk connect by join sql-92の組み合わせ

with t1 as (
    select 1 id, 0 parent, 'ROOT' name from dual 
    union all 
    select 2 id, 1 parent, 'CHILD-1' name from dual 
    union all 
    select 3 id, 1 parent, 'CHILD-2' name from dual 
), t2 as (
    select 1 t1id, 'node' special from dual 
) 
    select * from t1 
    left join t2 on t2.t1id=t1.id 
    start with id = 2 
    connect by prior parent = id; 

が、私はこの機能に関するドキュメントが見つかりませんでしたすべての列に

select * from t1 
    start with id = 2 
    connect by prior parent = id; 

    select * from t1 
    left join t2 on t2.t1id=t1.id; 

を返し、任意のはありますか?

+0

'T1を選択します。*、T2 *'作品。'SELECT *'がなぜそうでないのか分かりません。 – MT0

+0

'WHERE name is NOT NULL AND(特別IS NULLまたは特別IS NOT NULL) 'を追加すると、それらの列が' SELECT * 'に現れることを意味します。 – MT0

答えて

0

私はあなたが探しているドキュメントは、ここで見つけることができると信じて:Hierarchical Queries

最も関連性の高い部分:次のように

Oracleは階層問合せを処理します。

  • Aが参加し、結合がFROM句で指定されているのか、WHERE句の述部で指定されているのかが最初に評価されます。

  • CONNECT BY条件が評価されます。

  • 残りのWHERE節述部が評価されます。

Oracleは、次の手順を使用して階層を形成するために、これらの評価からの情報を使用:

  1. Oracleは、階層のルート行(複数可)を選択 - STARTを満たすそれらの行をWITH条件。

  2. Oracleは、各ルート行の子行を選択します。各子行は、いずれかのルート行に対してCONNECT BY条件の条件を満たす必要があります。

  3. オラクルでは、連続する子行の世代を選択します。 Oracleはまず、手順2で戻された行の子を選択し、次にその子の子を選択します。 Oracleは、現行の親行に関してCONNECT BY条件を評価することによって、常に子を選択します。

  4. 問合せに結合なしのWHERE句が含まれている場合、WHERE句の条件を満たさないすべての行が階層から削除されます。 Oracleは、条件を満たす行の子をすべて削除するのではなく、行ごとにこの条件を個別に評価します。

  5. Oracleは図9-1の順序で行を戻します。図では、子供は両親の下に表示されます。階層ツリーの説明については、図3-1「階層ツリー」を参照してください。

0

ないSQL-92が、SELECT達成は* + CONNECT BY + LEFT JOINは

WITH t1 AS (
    SELECT 1 ID, 0 PARENT, 'ROOT' NAME FROM dual 
    UNION ALL 
    SELECT 2 ID, 1 PARENT, 'CHILD-1' NAME FROM dual 
    UNION ALL 
    SELECT 3 ID, 1 PARENT, 'CHILD-2' NAME FROM dual 
), t2 AS (
    SELECT 1 t1id, 'node' special FROM dual 
) 
SELECT  * 
FROM  t1, t2 
WHERE t2.t1id(+) = t1.ID 
START WITH ID = 2 
CONNECT BY PRIOR PARENT = ID 
;