rownum в подзапросе - PullRequest
       6

rownum в подзапросе

2 голосов
/ 02 июля 2010

Я удивлялся, почему это не работает:

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 выдает ошибку
почему?

здоровается Ауро

Ответы [ 4 ]

2 голосов
/ 02 июля 2010

rownum - псевдостолбец в наборе результатов.Он не связан ни с одной таблицей и является одним из последних назначаемых объектов (это происходит после всех сортировок и т. Д.).

Возможно, функция row_number() будет более полезнойвы делаете, но, если вы хотите, чтобы числа оставались одинаковыми во всех вызовах запросов для каждой данной строки, вам придется хранить числа в базе данных (или использовать rowid, но это больше похоже насерийный номер и довольно некрасиво показывать конечным пользователям).Из вашего примера не совсем понятно, что вы ожидаете от rownum.

1 голос
/ 03 июля 2010

Читая между строками в комментариях выше и вашим SQL, я бы посоветовал прочитать аналитические функции Oracle.

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

Они отлично подходят для вычисления вещей, которые обычно требуют вложенных подзапросов, выполняющих групповые функции, то есть «дайте мне текущий баланс X для каждой строки», «дайте мнеранг X из общего набора данных »или просто« дайте мне общее количество данных ».

На первый взгляд их трудно понять, так как синтаксис сложный, так как они могут делать аналогичныезапросы для разделов вашего набора данных.

В вашем случае вы, вероятно, могли бы использовать операцию COUNT (*) OVER (), чтобы получить 'height' из вашей другой таблицы.

1 голос
/ 02 июля 2010

Псевдоним TBL используется не в подзапросе, а в основном запросе.то есть

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

не является допустимым запросом.

0 голосов
/ 02 июля 2010

Номер строки для каждой выходной строки - не для каждой таблицы

Почему бы не попробовать

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