2009-08-04 45 views
1

以下兩個查詢之間的區別是什麼?雙方將返回不同的行:兩個分析查詢之間的差異

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; 

這個查詢將返回的column2第一每個分區的值,來column1訂購分區。

由於SQL語言上套工作,和你的ORDER BY條款不做任何處理的CTE返回的集合中,Oracle只是忽略ORDER BY部分。

CBO可以選擇兌現,散列或以任何其他方式切去CTE它是由外部查詢使用之前,所以在CTE使用的ORDER BY將失去外部查詢。

0

第1列的排序在第一個查詢中沒有做任何事情。

它按順序創建一個結果集,但我認爲這不會影響您的分區聲明。 該排序屬於實際的分區條款。

0

第一個版本對column1設置的整個行進行排序,然後將其按column3進行分區並進行分析計算。請注意,第一列的初始排序不一定通過分區保留 - 我認爲這可能會讓你感到困擾。

第二個版本按column3分區數據,然後按column1對每個分區進行排序,然後確定分析輸出。