Поведение сервера базы данных Advantage - PullRequest
3 голосов
/ 26 апреля 2010

Я использую ADS v10 beta. Я пытаюсь подсчитать упорядоченный набор результатов.

1) ORDER BY во вложенных запросах. Мне нужно использовать вложенный SELECT для некоторых расчетов:

SELECT Name, Value, ROWNUM() FROM (SELECT * FROM MainTable WHERE Value > 0 ORDER BY Value) a

И я получаю

Expected lexical element not found: )
There was a problem parsing the table
names after the FROM keyword in your
SELECT statement.

Все работает хорошо, когда удален ORDER BY. Хотя я нашел образец в справке, он выглядит как мой запрос (действительно, более сложный):

SELECT * FROM (SELECT TOP 10 empid, fullname FROM branch1 ORDER BY empid) a UNION SELECT empid, fullname FROM branch2 ORDER BY empid

2) ORDER BY + ROWNUM(). Я использовал вложенный запрос в приведенном выше примере для нумерации упорядоченных строк. Есть ли шанс избежать вложенного запроса? В SQL Server я могу сделать что-то вроде этого:

SELECT Name, Value, ROW_NUMBER() OVER(ORDER BY Value) FROM MainTable WHERE Value > 1 ORDER BY Value

Пожалуйста, совет. Спасибо.

Ответы [ 2 ]

4 голосов
/ 26 апреля 2010

Я думаю, вам нужно переместить ORDER BY за пределы подзапроса:

SELECT Name, Value, ROWNUM() FROM 
  (SELECT * FROM MainTable WHERE Value > 0 ) a ORDER BY Value

Если вы хотите, чтобы rownum () был применен к упорядоченному набору результатов (сегодня утром я немного медленный), то может потребоваться использовать что-то вроде следующего:

SELECT Name, Value, ROWNUM() FROM 
  (SELECT top 100 PERCENT * FROM MainTable WHERE Value > 0 order by value ) a

Я не думаю, что ORDER BY в подзапросе разрешен, если только он на самом деле не изменяет результат ... однако в этом случае кажется, что он должен быть разрешен.

0 голосов
/ 26 апреля 2010

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

Вместо:

SELECT Name, Value, ROWNUM() 
FROM (SELECT * FROM MainTable WHERE Value > 0 ORDER BY Value) a

Используйте

SELECT a.Name, a.Value, ROWNUM() 
FROM (SELECT mt.* FROM MainTable mt WHERE mt.Value > 0 ORDER BY mt.Value) a

Проблема может заключаться в том, что оно путает поле value в предложении order by - оно не знает, из какой таблицы его получить, 1-го или 2-го.

...