我在使用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获取所有内容之前计算表列的统计属性。
谢谢
答案 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