ORACLE - 选择具有不同多个COLUMNS的ROWNUM

时间:2017-03-27 20:30:46

标签: sql oracle

您好我正在从java应用程序调用SQL quires,因为表有大量数据需要花时间从java端处理。现在我正在调用1000个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 ?;

但是这个查询给出了错误,不允许添加rownum AS作为distinct。请问您能帮助我们解决上述用例吗?

1 个答案:

答案 0 :(得分:1)

oracle 数据库中,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 ?;