Oracle SQL随机示例 - 缺乏ROWID

时间:2014-12-04 21:43:16

标签: sql oracle

我在使用SAMPLE子句时遇到了一个奇怪的问题。为什么第一个SQL不起作用,而第二个SQL工作正常。

SELECT * FROM SYS.ALL_TABLES SAMPLE(10)   

SELECT * FROM MIDAS.GERMPLASM SAMPLE(10)

我试图SAMPLE SQL查询而不仅仅是一个表,但我无法弄清楚我应该如何使用SAMPLE子句。除了样本条款还有其他方法吗?注意:我想以随机的方式做到这一点;不是前N行。

更新

首先,感谢您阅读此Q以提供帮助。但我已经知道这个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

我希望得到小的随机数据子集(来自查询),以便在从DB获取所有内容之前计算表列的统计属性。

谢谢

1 个答案:

答案 0 :(得分: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