子查询中的rownum

时间:2010-07-02 12:22:39

标签: sql oracle rownum

我想知道为什么这不起作用:

SELECT 
  (
    SELECT COALESCE(MAX(a.LaufNr),0) + TBL.Rownum
    FROM schemaB.PersonRelatedTbl A
    WHERE A.Persid = Tbl.Persid
  )
  , Tbl.Some_Other_Attributs
FROM schemaA.PersonRelatedTbl TBL 
WHERE ...

+ TBL.Rownum会出错 为什么呢?

招呼 AURO

4 个答案:

答案 0 :(得分:2)

rownum是结果集中的伪列。它与任何表都没有关联,并且是最后被分配的东西(它在所有排序之后发生等)。

row_number()函数可能对您正在执行的操作更有用,但是,如果您希望数字在每个给定行的所有查询调用中保持相同,那么您将会必须将数字存储在数据库中(或使用rowid,但是,这更像是序列号,并且向最终用户显示非常难看)。从你的例子中可以清楚地看出你期望rownum做什么。

答案 1 :(得分:1)

TBL别名不在子查询中使用,而是在主查询中使用。即

SELECT COALESCE(MAX(a.LaufNr),0) + TBL.Rownum
FROM schemaB.PersonRelatedTbl A
WHERE A.Persid = Tbl.Persid

不是有效查询。

答案 2 :(得分:1)

在上面评论中的行和SQL之间进行阅读,我建议阅读Oracle的分析函数。

http://www.orafaq.com/node/55

这些非常适合计算通常需要执行组函数的嵌套子查询的东西 - 即'给我每行的X的运行平衡','从总数据集中给出X的等级'或者只是“给我总数据数”。

一开始很难理解的是语法很复杂,因为它们可以对数据集的分区进行类似的查询。

在您的情况下,您可以使用COUNT(*)OVER()操作从其他表中获取“高度”。

答案 3 :(得分:0)

行数是每个输出行 - 不是每个表

为什么不试试

SELECT 
  (
    SELECT COALESCE(MAX(a.LaufNr),0)
    FROM schemaB.PersonRelatedTbl A
    WHERE A.Persid = Tbl.Persid
  ) || rownum, Some_Other_Attributs
FROM schemaA.PersonRelatedTbl TBL 
WHERE ...