2010-07-02 96 views
2

我wondring为什么这不起作用: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

回答

2

rownum是在结果集的虚列。它不与任何表相关联,并且是最后分配的东西之一(它发生在所有排序之后,等等)。

有可能row_number()函数对你正在做的事情更有用,但是如果你希望数字在每个给定行的所有查询调用中保持不变,那么你将不得不存储数据库中的数字(或使用rowid,但是,这更像是一个序列号,对最终用户来说显得很丑)。从你的例子中不太清楚你期望rownum正在做什么。

+0

不是我列表中的一列。 我有一张桌子,一个人可以有更多的一排像历史一样。我需要合并2个表(相同的属性等),当我使用这个脚本(它的插入/选择)我不知道实际的行号。 SOI想读取用户的实际highst,并开始在这个数字增加(例如5是HIST现在的话,我想先从6加...等) – domiSchenk 2010-07-02 14:33:43

+0

“(它发生毕竟排序等)”这可能是为什么它的剂量起作用。谢谢! – domiSchenk 2010-07-02 14:39:19

+1

它在排序之前被分配,这可能会导致一些人的问题。 从big_table_of_numbers WHERE ROWNUM <3 ORDER BY numval DESC 会得到从表2个的数字,然后按降序排列,而不是最后2个数字责令其SELECT numval。 它获得的2个数字取决于数据库。 你需要做SELECT * FROM(SELECT numval FROM blah ORDER BY numval DESC)WHERE rownum <2 – JulesLt 2010-07-02 17:48:50

1

的TBL别名没有在子查询,但在主查询使用。即

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

不是一个有效的查询。

+0

嗯,我想那不是问题:d coze我有Tbl.Persidand它工作正常 – domiSchenk 2010-07-02 14:35:36

0

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

为什么不试试

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 ... 
+0

犯规|| neans只是在后面?像1 || 2 = 12? – domiSchenk 2010-07-02 14:34:41

+0

是的 - 这是字符串concatenation的捷径 - 所以它会自动将任何一方的类型转换为字符串。 你也仍然有ROWNUM将有一个任意值的问题。 – JulesLt 2010-07-03 08:05:23

1

在上述评论的线,你的SQL之间的阅读,我会建议对Oracle的解析函数读了。

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

这些都是非常适合计算事情,通常需要嵌套子查询执行组的功能 - 即“给我X的每一行的运行平衡”,“给我X的等级之外的整套数据'或者简单地'给我数据的总数'。

是什么让他们很难在第一把握的是,语法是复杂的,因为他们可以为您的数据集的分区做类似的查询。

你的情况,你可能可以使用COUNT(*)OVER()操作以获取来自其他表中的“高度”。