2014-12-04 56 views
0

我在使用SAMPLE子句時出現了一個奇怪的問題。爲什麼第一個SQL不起作用,而第二個則正常工作。隨機抽樣Oracle SQL - 在缺乏ROWID的情況下

SELECT * FROM SYS.ALL_TABLES SAMPLE(10) 

SELECT * FROM MIDAS.GERMPLASM SAMPLE(10) 

我試圖SAMPLE SQL查詢不只是一個表,但我無法弄清楚如何我應該使用樣本條款。樣本條款之外還有其他方法嗎?注意:我想以隨機方式做到這一點;不是第N行。

更新:

首先,感謝您閱讀這個問答,以幫助。但是我已經知道這個SQL不起作用,因爲SAMPLE子句使用隱藏列ROWID。我不知道如何做到這一點,如果表中不存在ROWID。

這裏是一個重複的例子,SQL,我嘗試隨機抽樣:

SELECT cols.table_name, cols.column_name, cols.position, cons.status, cons.owner, cons.constraint_type 
FROM all_constraints cons, all_cons_columns cols 
WHERE cons.constraint_name = cols.constraint_name 
AND cons.owner = cols.owner 
ORDER BY cols.table_name, cols.position 

我想小數據隨機子集(從查詢),從數據庫讀取之前的一切計算表列的統計特性。

謝謝

+0

將'sys.all_all_tables'改爲'sys.all_tables' – 2014-12-04 21:52:25

+0

它不起作用!我想到了兩個潛在的問題:1.本表沒有主鍵; 2. SAMPLE子句使用像ROWID這樣的隱藏列來進行抽樣! – 2014-12-04 21:54:59

+1

取代視圖採樣,請嘗試對視圖所基於的表格進行採樣。祝你好運。 – 2014-12-04 22:52:22

回答

4

當您嘗試運行第一個查詢是一個相當大的線索,你得到的錯誤信息:

ORA-01446: cannot select ROWID from, or sample, a view with DISTINCT, GROUP BY, etc. 

這是從這個非常清楚,我認爲在SAMPLE功能需要訪問ROWID工作。由於ROWID是數據庫用於物理定位行的僞列,因此ROWID不確定(例如數據被聚合時)的任何查詢都不能在外部查詢上使用SAMPLE。在ALL_ALL_TABLES的情況下,它是通過UNION組合兩個表的視圖阻止訪問ROWID


從修改後的問題,即跳出我的第一件事就是SAMPLE條款必須FROM子句中,表名和任何別名之間。我能夠查詢到樣品與加入這樣的:

SELECT * 
FROM table_a SAMPLE (10) a 
     JOIN table_b SAMPLE (10) b 
     ON a.column1 = b.column1 

關於你實際的查詢,我試圖用你試圖在同一時間品嚐一個表(再次,實際上是視圖):

select * from all_constraints sample(10) 

ORA-01445: cannot select ROWID from, or sample, a join view without a key-preserved table 

select * from all_cons_columns sample(10) 

ORA-01445: cannot select ROWID from, or sample, a join view without a key-preserved table 

這個消息很清楚:這些視圖中的表都沒有保存鍵(即保證每行返回不超過一次),所以你不能對它們進行採樣。


以下查詢應該可以使用DBMS_RANDOM手動創建隨機樣本。

SELECT * 
FROM  (SELECT cols.table_name, 
       cols.column_name, 
       cols.position, 
       cons.status, 
       cons.owner, 
       cons.constraint_type, 
       DBMS_RANDOM.VALUE rnd 
      FROM all_constraints cons 
       JOIN all_cons_columns cols 
        ON  cons.constraint_name = cols.constraint_name 
         AND cons.owner = cols.owner) 
WHERE rnd < .1 
ORDER BY table_name, position 
+0

非常感謝。 :) 它正在工作。 – 2014-12-04 22:51:37