關於distinct關鍵字

1............

當連接的表數據量很大,但是SELECT的最終結果不是很多,且SELECT列的個數不是很多的時候,加上DISTINCT之後,這個排序的代價要小於SEMI JOIN連接的代價。這就是增加一個DISTINCT操作查詢效率反而提高,這個似乎不可能發生的情況的真正原因。

不加DISTINCT的情況,由於使用IN子查詢的查詢,Oracle對第二個連接採用了HASH JOIN SEMI,這種HASH JOIN SEMI相對於普通的HASH JOIN,代價要大一些。

 

SQL> SELECT  /*distinct*/  T1.OBJECT_NAME, T1.OBJECT_TYPE, T2.TABLESPACE_NAME
  2 FROM T1, T2
  3 WHERE T1.OBJECT_NAME = T2.SEGMENT_NAME
  4 AND T1.OBJECT_NAME IN
  5 (
  6 SELECT INDEX_NAME FROM T3
  7 WHERE T3.TABLESPACE_NAME = T2.TABLESPACE_NAME
  8 );

 

2.............

  • Oracle 9i數據庫,執行下面語句出現錯誤“ORA-01791: 不是 SELECTed 表達式 ”:

    select distinct name from Share_URL_Seeds order by id 

    原來:SELECT語句中含有DISTINCT關鍵字或者有運算符時,排序用字段必須與SELECT語句中的字段相對應。

    網上搜到解釋如下:

    在ORDER BY中指定多個列,結果將先按照子句中的第一列排序,然後第二個,依此類推。

    在SELECT中未出現的列名也可用於ORDER BY 子句中,只要TABLE中有就行。

    但如果SELECT子句中出現了DISTINCT關鍵字,則只能用出現過的列名,

    而且如果SELECT子句中使用了任何運算符,在ORDER BY 子句中必須保持和SELECT子句中表達式完全一致,否則出現錯誤:“ORA-01791: 不是 SELECTed 表達式”。

     

     

    如果想按照id排序,而又使name不重複,可用以下sql語句:

    SELECT distinct name, min(id) as b FROM Share_URL_Seeds where Type=1 group by name order by b;

發佈了47 篇原創文章 · 獲贊 2 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章