4

由于表中的行数太大,我从“ORDER BY dbms_random.value”构造切换到 SAMPLE 子句以获得 1000 个随机行。完成只需不到一秒钟而不是 3 分钟。但是在某些表上我得到了这个错误

ORA-01446: 无法使用 DISTINCT、GROUP BY 等从视图中选择 ROWID

我的查询如下所示:

SELECT t1.columnA FROM 
(SELECT columnA FROM table1 sample(1) where rownum <= 1000)  t1 
JOIN table2 t2 
ON (t1.columnA = t2.columnA) 
WHERE t2.columnB IS NOT NULL

它在某些表上工作正常,但在其他表上失败。我放弃了谷歌搜索,您能否就我的情况提出任何解决方法。

4

1 回答 1

3

正如我所期望的那样,SAMPLE 子句的工作速度比所有其他解决方案都快(在这里你可以看到其中一些

因为我通常是 Oracle DB 的新手,特别是 Oracle SQL Developer,所以我错误地将视图称为“表”。在我发现解决方案很清楚之后。

解决方案:我必须查看形成视图的 SQL 查询并将视图名称替换为该查询。例如,我的 table1 实际上是一个视图,我将其名称替换为形成该视图的 SELECT 查询:

SELECT t1.columnA FROM 
(SELECT columnA FROM (select distinct tt1.columnA,  tt2.columnC
  from table22 tt2, table11 tt1
 where tt2.columnC = tt1.columnA) sample(1) where rownum <= 1000)  t1 
JOIN table2 t2 
ON (t1.columnA = t2.columnA) 
WHERE t2.columnB IS NOT NULL

之后,我可以使用表格并将 SAMPLE 应用于它们!谢谢大家,很棒的网站!=) PS:对不起我的英文和丑陋的代码facepalm.jpg

于 2013-01-31T17:04:02.057 回答