2009-08-04 22 views
1

次の2つのクエリの間にはどのような違いがありますか?どちらのリターン異なる行:2つの分析クエリの相違点

with ordered_table as 
(
select * from table order by column1 
) 
select first_value(column2 ignore nulls) over (partition by column3) 
from ordered_table; 

select first_value(column2 ignore nulls) over (partition by column3 order by column1) 
from table; 

注:私は、テストケースを提供しようとするでしょうが、私は誰かが明確なコンセプトを持つために必要とされていないと思います。

答えて

0
WITH ordered_table AS 
     (
     SELECT * 
     FROM table 
     ORDER BY 
       column1 
     ) 
SELECT FIRST_VALUE(column2 IGNORE NULLS) OVER (PARTITION BY column3) 
FROM ordered_table 

このクエリでは、順不同でcolumn2の最初のパーティションごとの値を返します(すなわちCBOはそれが最善と考える任意の順序を自由に選択することが)。

SELECT FIRST_VALUE(column2 IGNORE NULLS) OVER (PARTITION BY column3 ORDER BY column1) 
FROM table; 

このクエリは、column1が注文したパーティションで、column2の最初のパーティションごとの値を返します。 SQL言語がセットで動作し、あなたのORDER BY節がCTEで返されたセットで何もしません

ので、OracleはちょうどORDER BY部分を無視します。

CBOは、それが外側のクエリで使用される前のハッシュまたは他の方法では、CTEを不具、実体化するように選択することができますので、CTEで使用ORDER BYは、外部クエリのために失われます。

0

column1による並べ替えは、最初のクエリで実際に何もしません。

結果セットを順番に作成しますが、それはあなたのパーティションステートメントには含まれません。 注文は実際のパーティション節に属します。

0

最初のバージョンでは、column1で設定した行全体を並べ替え、次にcolumn3で分割し、分析計算を行います。 column1による最初の順序付けは、必ずしもパーティション化を通じて保持されているわけではないことに注意してください。

2番目のバージョンでは、データをcolumn3でパーティション化し、各パーティション内でcolumn1でソートし、解析出力を決定します。