2016-08-10 4 views
-1

Oracle 11gを使用しています。このSQL文はどのような順序で "解析"されますか?SQL同じ命令文にDISTINCTとAVGが存在する場合の実行順序

COL2で多くの重複値が存在すると仮定:

SELECT DISTINCT col1, AVG(col2) 
FROM table1 
GROUP BY col1 

だろう、それは: 1.すべての重複col1削除 - col2データの組み合わせを、その後、この減少した結果セットにcol2に平均を行い、OR 2.最初にcol2に集計平均を行い、次にこの結果セットでdistinctを実行しますか?

+9

を、' DISTINCT'は冗長です結果はすでに異なっています。 – jarlh

+0

jarlhさんのコメントで拡大:GROUP BYはSELECTの前に処理されます。ですから、この例を変更して、問題が解決されないようにすることはできません。質問は、どのようにクエリを書き直しても問題ありません。GROUP BYが最初に処理され、GROUP BY列のみがSELECTに含まれることができます(どちらの時点でもDISTINCTになっています)。 – mathguy

+0

@jarlh Col1でグループ化すると、col1でグループ化するだけではありませんか?だから、この場合col2はまだ複数の複製を持つことができますか?私の質問は、SELECTにDISTINCTを指定しても、col2内の重複には何の影響もありません。チェックありがとう! – maverick

答えて

2

exampeは、自己説明する必要があります:DISTINCTの結果の上にGROUPを適用

SQL> create table testDistinct (col1, col2) as(
    2 select 1, 100 from dual union all 
    3 select 1, 10 from dual union all 
    4 select 1, 10 from dual union all 
    5 select 2, 50 from dual union all 
    6 select 3, 1 from dual union all 
    7 select 3, 100 from dual 
    8 ); 

Table created. 

SQL> select col1, avg(col2) 
    2 from testDistinct 
    3 group by col1; 

     COL1 AVG(COL2) 
---------- ---------- 
     1   40 
     2   50 
     3  50,5 

SQL> select DISTINCT col1, avg(col2) 
    2 from testDistinct 
    3 group by col1; 

     COL1 AVG(COL2) 
---------- ---------- 
     1   40 
     2   50 
     3  50,5 

ができます:あなたがcol1` BY `GROUPを行うので

SQL> select col1, avg(col2) 
    2 from (
    3  select DISTINCT col1, col2 
    4  from testDistinct 
    5 ) 
    6 group by col1; 

     COL1 AVG(COL2) 
---------- ---------- 
     1   55 
     2   50 
     3  50,5 
+0

ありがとう!つまり、DISTINCTは意味がありません。 – maverick

+1

'DISTINCT'はクエリでは意味がありませんが、Oracleが最適化するほどスマートであるかどうかはわかりません。 –

関連する問題