Как преобразовать SQL-запрос с использованием общих табличных выражений в один без (для SQL Server 2000) - PullRequest
2 голосов
/ 23 ноября 2010

Я только что нашел адекватное решение для Как найти строки, которые являются дубликатами по ключу, но не дублируются во всех столбцах? , закодировал хранимую процедуру, затем узнал, что база данных застряла на SQL Server 2000.

Мое решение, конечно, сильно зависит от выражений общих таблиц.

Может кто-нибудь предоставить мне набор правил для преобразования обратно в диалект SQL Server 2000?

Обратите внимание, что у меня есть что-то вроде этого:

;
WITH CTE1 AS ( ... ),
CTE2 AS (SELECT ... FROM CTE1 ... ),
CTE3 AS (SELECT ... FROM CTE1 INNER JOIN CTE2 ...)
SELECT * FROM CTE3
WHERE criteria
ORDER BY sequence

Это может сделать вещи более интересными ...


Обновление: Ни один из CTEрекурсивны.

Ответы [ 2 ]

6 голосов
/ 23 ноября 2010

Два варианта (предоставлено, ни один не симпатичен - вот почему нам нравятся CTE)

ВАРИАНТ 1

Создайте временную таблицу (# или, если она достаточно мала, @) и обращайтесь к ней, как к CTE. Бросьте, когда вы закончите.

ВАРИАНТ 2 Поместите весь CTE SELECT в виде таблицы в часть запроса FROM.

SELECT *
FROM  (SELECT *
       FROM table1) oldCTE
3 голосов
/ 23 ноября 2010

Я не думаю, что можно придумать правила, которые бы легко конвертировали any cte в оператор non-cte.поскольку возможности слишком открыты (особенно если вы работаете с рекурсивными CTE).Самое близкое, что я могу придумать, это взять каждый CTE по порядку, разбить его на собственный запрос и использовать его для заполнения временной таблицы, используемой следующими запросами.Вряд ли эффективен и не гарантирован для работы во всех возможных ситуациях.

...