Хранение его простой и как сделать несколько CTE в вопросе

У меня есть этот простой вопрос T-SQL, он испускает связку колонок от стола и также присоединяется к информации из других связанных таблиц.

Моя модель данных проста. У меня есть запланированное событие с участниками. Я должен знать, сколько участников участвует в каждом событии.

Мое решение этого состоит в том, чтобы добавить CTE, что группы наметили события и считают число участников.

Это позволит мне участвовать в той информации за запланированное событие. Хранение простого вопроса.

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

Я действительно хотел бы его, если у меня могло бы быть несколько CTEs, но я не могу, правильно? Каковы мои варианты здесь?

Я исключил взгляды и выполнение вещей в слое данных приложения. Я предпочитаю изолированному свои вопросы SQL.

136
задан John Leidegren 26 January 2010 в 16:22
поделиться

2 ответа

Вы можете иметь несколько CTE в одном запросе, а также повторно использовать CTE :

WITH    cte1 AS
        (
        SELECT  1 AS id
        ),
        cte2 AS
        (
        SELECT  2 AS id
        )
SELECT  *
FROM    cte1
UNION ALL
SELECT  *
FROM    cte2
UNION ALL
SELECT  *
FROM    cte1

Обратите внимание, однако, что SQL Server может переоценить CTE каждый раз, когда оно обращается, поэтому, если вы используете значения, такие как RAND () , Newid () и т. Д. Они могут измениться между вызовами CTE .

261
ответ дан 23 November 2019 в 23:38
поделиться

Вы, безусловно, можете иметь несколько CTE's в одном выражении запроса. Вам просто нужно отделить их с запятой. Вот пример. В приведенном ниже примере присутствуют два CTE. Одно названо CountryAndnumberofProducts , а второй называется ProductsOverteDendollars .

WITH CategoryAndNumberOfProducts (CategoryID, CategoryName, NumberOfProducts) AS
(
   SELECT
      CategoryID,
      CategoryName,
      (SELECT COUNT(1) FROM Products p
       WHERE p.CategoryID = c.CategoryID) as NumberOfProducts
   FROM Categories c
),

ProductsOverTenDollars (ProductID, CategoryID, ProductName, UnitPrice) AS
(
   SELECT
      ProductID,
      CategoryID,
      ProductName,
      UnitPrice
   FROM Products p
   WHERE UnitPrice > 10.0
)

SELECT c.CategoryName, c.NumberOfProducts,
      p.ProductName, p.UnitPrice
FROM ProductsOverTenDollars p
   INNER JOIN CategoryAndNumberOfProducts c ON
      p.CategoryID = c.CategoryID
ORDER BY ProductName
77
ответ дан 23 November 2019 в 23:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: