Поддерживает ли Sybase ASE 12.5 Стандартные табличные выражения? - PullRequest
4 голосов
/ 26 января 2011

Я заметил, что Sybase SQL Anywhere поддерживает их, но не может найти никакой документации по ASE, также делающей это.

Если этого не произойдет, какой мой лучший вариант для создания рекурсивного запроса? В SQL Server 2008 я сделал бы это с CTE, но если это не доступно? Возможно, функция?

Ответы [ 2 ]

0 голосов
/ 14 июня 2012

Sybase ASE 12.5 (а также 15.0) не поддерживает CTE.


Вы можете использовать внутренний запрос для решения вашей проблемы.

Простой CTE, подобный этому:

WITH Sales_CTE (Folders_Id)
AS
-- Define the CTE query.
(
    SELECT Folders_Id FROM Folders
)
SELECT Folders_Id FROM Sales_CTE

такой же, как этот:

SELECT aux.Folders_Id
FROM (SELECT Folders_Id FROM Folders) aux

Для получения дополнительной информации, проверьте это !

0 голосов
/ 28 января 2011
  1. С 1984 года Standard и Sybase допускают полную рекурсию. Обычно мы выполняем рекурсию в хранимых процессах, чтобы контролировать глубину, избегать бесконечных циклов и выполнять быстрее, чем некомпилированный SQL и т. Д.

    Хранимые процессы не имеют ограничений на рекурсию, конструкцию набора результатов и т. Д. Конечно, определение содержимого скобок как представления снова сделает его более быстрым (в конце концов, это настоящий вид, а не тот, который мы должны материализовать раз нам это нужно).

    Суть в том, что если вы привыкли к этому методу (рекурсия на сервере, процедура, закодированная для рекурсии), то мне, как и мне, нет необходимости в CTE с его новым синтаксисом; нескомпилированные скорости; временные таблицы; рабочие столы; курсор «гуляет» по иерархии; все это приводит к ужасающей производительности .

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

  2. Второй вариант - использовать динамический SQL. Просто создайте SELECT, по одному на каждый уровень иерархии, и продолжайте добавлять UNION, пока не закончится уровень; затем выполните.

Вы можете использовать функцию для предоставления возможности CTE, но не делайте этого. Функция предназначена для другой, ориентированной на столбцы цели, код подчиняется этим ограничениям. Это скаляр, хорошо для построения значения столбца. Хранимые процедуры и CTE ориентированы на строки.

...