множественный cte в одном операторе select, где ctes может ссылаться друг на друга - PullRequest
2 голосов
/ 29 октября 2009

Расширяя следующий вопрос ( Оператор множественного выбора ) Я хотел бы знать, могу ли я сделать следующее:

WITH 
    cte1 as (
      SELECT * from cdr.Location
    ),
    cte2 as (
      SELECT * from cdr.Location
        WHERE cdr.Location.someField = cte1.SomeField
    )
select * from cte1 union select * from cte2

Итак, акцент здесь на следующей строке:

 WHERE cdr.Location.someField = cte1.SomeField

где внутри cte2 я ссылаюсь на cte1?

1 Ответ

8 голосов
/ 29 октября 2009

Да, вы можете ссылаться на ранее объявленные CTE в последующих CTE:

WITH cte1 as (
  SELECT t.* 
    FROM cdr.Location t),
     cte2 as (
  SELECT t.* 
    FROM cdr.Location t
    JOIN cte1 c1 ON c1.somefield = t.someField)
SELECT * 
  FROM cte1 
UNION 
SELECT * 
  FROM cte2

ПРИМЕЧАНИЯ

  1. Присоединение к cte2 в объявлении cte1 не будет работать, потому что оператор выполняется сверху вниз.
  2. Вы ссылаетесь на CTE, как на любое другое встроенное представление (каким оно является) или на таблицу / временную таблицу / и т. Д., Присоединяясь к тому, что вам нужно.

Кстати: попробуйте сформулировать лучший пример в будущем - это полезно для вас и остальных членов SO-сообщества, которые пытаются вам помочь.

...