ORACLE - 选择具有不同多列的 ROWNUM

  • 本文关键字:ROWNUM 选择 ORACLE sql oracle
  • 更新时间 :
  • 英文 :


嗨,我正在从java应用程序调用SQL查询,由于表具有大量数据,因此从java端处理需要时间。现在我正在调用 1000 x 1000 条记录

SELECT t1.col1,t1.col2,t2.col1,t2.col2 FROM(SELECT rownum AS rn,
t1.col1,
t1.col2,
t2.col1,
t2.col2 FROM table1 t1,
table2 t2 WHERE t1.id=t2.id) WHERE rn BETWEEN ? AND ?;

但是我还有一个查询,它具有不同的值,如下所示

SELECT t1.col1,t1.col2,t2.col1,t2.col2 FROM(SELECT rownum AS rn,
distinct t1.col1,
t1.col2,
t2.col1,
t2.col2 FROM table1 t1,
table2 t2 WHERE t1.id=t2.id) WHERE rn BETWEEN ? AND ?;

但是这个查询给出了错误,不允许为不同位置添加行数 AS rn。请您帮助我们解决上述用例吗?

预言机数据库中,DISTINCT关键字只允许直接在SELECT关键字后面或COUNT函数内。

此外,您的SQL将导致不一致的结果,因为在oracle数据库中,如果没有明确的ORDER BY子句,则无法保证记录的顺序。

您也无法从内部选择中访问 tabla 别名,因此,如果不同表中的列具有相同的列名,则必须应用列别名。

最好的解决方案是添加另一层嵌套选择:

SELECT t1_col1, t1_col2, t2_col1, t2_col2
FROM (
SELECT rownum AS rn, inner_tab.*
FROM (
SELECT distinct t1.col1 AS t1_col1,
t1.col2 AS t1_col2,
t2.col1 AS t2_col1,
t2.col2 AS t2_col2
FROM table1 t1,
table2 t2 
WHERE t1.id=t2.id
ORDER BY 1 -- you have to decide! 
) inner_tab
) WHERE rn BETWEEN ? AND ?;

最新更新