powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Best practice по сведению двух CTE
25 сообщений из 98, страница 1 из 4
Best practice по сведению двух CTE
    #39563317
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спецы, поделитесь пожалуйста best practice.

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

Что посоветуете? Вью? Табличную функцию? Может можно как-то вложить CTE в CTE ? Etc...?

Спасибо.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563335
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут еще друидский круг нужен, как без него CTE в CTE вкладывать-то?...

З.Ы. Берете и делаете
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563336
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slovnetМожет можно как-то вложить CTE в CTE ? Etc...?Через запятую. Посмотрите справку с примерами по CTE
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563338
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

Я так понял здесь специалисты отвечают на вопросы новичков.
Вот мне понадобилось решить задачу на T-SQL , на котором обычно не пишу.
Вот у меня вопрос.
Причём не прошу код за меня написать. Прошу описать в паре предложений как обычно такие вопросы решаются.

К чему это глумление?

Заранее спасибо за конструктивную помощь.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563340
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

Спасибо, посмотрю. Раньше что-то не нагуглилось такое.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563344
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slovnetalexeyvg,

Спасибо, посмотрю. Раньше что-то не нагуглилось такое.Лучше справку смотреть, а не гуглить (хотя справка у МС ухудшается с каждым годом).
Просто после определения CTE ставите запятую, и пишите новое определение CTE, в котором можно использовать предыдущее (все предыдущие).

Пример из справки "C. Using multiple CTE definitions in a single query"
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
WITH Sales_CTE (SalesPersonID, TotalSales, SalesYear)  
AS  
-- Define the first CTE query.  
(  
    SELECT SalesPersonID, SUM(TotalDue) AS TotalSales, YEAR(OrderDate) AS SalesYear  
    FROM Sales.SalesOrderHeader  
    WHERE SalesPersonID IS NOT NULL  
       GROUP BY SalesPersonID, YEAR(OrderDate)  
  
)  
,   -- Use a comma to separate multiple CTE definitions.  
  
-- Define the second CTE query, which returns sales quota data by year for each sales person.  
Sales_Quota_CTE (BusinessEntityID, SalesQuota, SalesQuotaYear)  
AS  
(  
       SELECT BusinessEntityID, SUM(SalesQuota)AS SalesQuota, YEAR(QuotaDate) AS SalesQuotaYear  
       FROM Sales.SalesPersonQuotaHistory  
       GROUP BY BusinessEntityID, YEAR(QuotaDate)  
)  
  
-- Define the outer query by referencing columns from both CTEs.  
SELECT SalesPersonID  
  , SalesYear  
  , FORMAT(TotalSales,'C','en-us') AS TotalSales  
  , SalesQuotaYear  
  , FORMAT (SalesQuota,'C','en-us') AS SalesQuota  
  , FORMAT (TotalSales -SalesQuota, 'C','en-us') AS Amt_Above_or_Below_Quota  
FROM Sales_CTE  
JOIN Sales_Quota_CTE ON Sales_Quota_CTE.BusinessEntityID = Sales_CTE.SalesPersonID  
                    AND Sales_CTE.SalesYear = Sales_Quota_CTE.SalesQuotaYear  
ORDER BY SalesPersonID, SalesYear;  
GO
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563347
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

Моя задача чуть сложнее. Мне нужно второй CTE селектить из результата первого.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563352
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, увидел. Обращение к первому CTE тоже работает.

Огромное спасибо! Это то что искал.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563388
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slovnetК чему это глумление?

Заранее спасибо за конструктивную помощь."Мне надо забить гвоздь. Что посоветуете? Бить правой рукой? Бить с разбега? Или повыше прыгнуть? Может как-то можно гвоздь молотком забить? Вот мне понадобилось решить задачу, которой обычно не занимаюсь. Причём не прошу сделать это за меня. Прошу описать в паре предложений как обычно такие вопросы решаются.".

Вам самому не смешно? Уж простите, в ответе не больше глумления, чем вы своим вопросом продемонстрировали. В справке все уже давно с примерами расписано.

Заранее спасибо за адекватные вопросы.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563392
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

Клоунада не делает Вам чести.

Забивание гвоздя - операция простая, интуитивная, в один цикл.
Мне надо было произвести операцию в несколько циклов, один из которых пользуется результатом предыдущего. Никак с забиванием гвоздя не сравнить.
Для незнакомой среды - нетривиально. Потратил несколько часов на попытку самостоятельного решения.

Уважаемый alexeyvg счёл мой вопрос адекватным - и помог. Спасибо ему.

Вы же предпочли глумиться.

Нет, мне не жалко, наздоровье. Главное, получил ответ на свой вопрос.
Да и Вас воспитывать не претендую - поди взрослый дядя.
Спасибо что модерируете этот форум.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563395
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slovnetУважаемый alexeyvg счёл мой вопрос адекватным - и помог. Спасибо ему.Уважаемый alexeyvg -- поблагодарим же его за терпение -- вам перепечатал хелп синтаксиса.
slovnetЗабивание гвоздя - операция простая, интуитивная, в один цикл.
Мне надо было произвести операцию в несколько циклов, один из которых пользуется результатом предыдущего. Никак с забиванием гвоздя не сравнить.
Для незнакомой среды - нетривиально. Потратил несколько часов на попытку самостоятельного решения.
Т.е за два часа не смогли найти и осилить примеры к синтаксису, который гуглится за 30 секунд. Если это нетривиально, то у меня для вас плохие новости, ага.

Спасибо за интересный вопрос (два).
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563425
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slovnetЗабивание гвоздя - операция простая, интуитивная, в один цикл.
Мне надо было произвести операцию в несколько циклов, один из которых пользуется результатом предыдущего. Никак с забиванием гвоздя не сравнить.
Для незнакомой среды - нетривиально. Потратил несколько часов на попытку самостоятельного решения.А вы не гуглите, не надо, по отдельным командам это точно непродуктивно.
Возникла задача, тем более конкретно с командой CTE, так читайте сразу в хелпе, с примерами. Это точно бы не заняло несколько часов.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563467
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

Спасибо за совет насчёт хелп vs гугл. Буду знать.

Я видел этот хелп. И делал такое не раз. Но это пример обычного CTE.
А мне надо было результат уже сведённых таблиц отфильтровать дистинктом по части полей и нацепить на него нарастающий итог.
Такого примера в хелпе нет. Не пришло в голову что можно тупо выбрать из предыдущей таблицы CTE.
Пытался сложить CTE во вью и приджойнить к нему ещё один CTE, но понимал что это неправильный ход. Поэтому здесь спросил.

Ещё раз спасибо, ваша помощь это как раз пример того как можно потратив 5 минут сэкономить другому пару часов поисков.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563469
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slovnet,

точно в хедп смотрели?

https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql

C. Using multiple CTE definitions in a single query
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563478
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

Уважаемый мэтр,
Покажите пожалуйста мастер-класс тривиального нахождения гуглом за 5 минут решения моей задачи обозначенной в первом сообщении.
То есть пример синтаксиса который решит именно эту задачу.

Спасибо.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563481
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563486
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

при всём (огромном) уважении, зря Вы так сегодня.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563492
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

Спасибо.

Я читал этот хелп. И сейчас ещё раз посмотрел.
Этого недостаточно было для решения моей задачи.
Я делал как в этом примере, до того как сдесь спросил. Этого давало декартово произведение. И дистинкт тут не поможет.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563495
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cammomile,

И как эта ссылка даёт ответ на поставленный вопрос.
Вы первое сообщение читали?
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563496
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slovnet,

авторЭтого давало декартово произведение.
что-то всё хуже и хуже.. cte само вам умножало? жестокая штука....

*сдесь :)
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563507
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый TaPaK,

Вы первое сообщение читали? Я прямо там всё объяснил.

В CTE да, умножаются строки, мне именно так и надо.
Но нарастающий итог надо нацепить на схлопнутую выборку, по урезанному количеству полей.
То есть надо взять результат готового CTE, сделать по нему дистинкт по части полей, потом в этой уже схлопнутой выборке добавить ROW_NUMBER() OVER (PARTITION BY... и к этому прицепить нарастающий итог а потом приджойнить результат к изначальной умноженной выборке.

Есть такой пример в хелпе?

P.S. *сдесь - опечатка, печатаю транслитом.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563509
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slovnet,

авторТо есть надо взять результат готового CTE да в хелпе есть пример использования как минимум двух результатов cte
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563520
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

Ну вот и ткните меня носом в синтаксис который решит именно эту задачу.

P.S.
Надо понимать, насчёт умножения записей уже не так плохо и жёстко?
И почему приведенный Вами раньше пример не подходит тоже разобрались?

P.P.S
Мне ж не жалко, пусть мне покажут что не умею читать хелп и покажут где именно пропустил нужное.
Только спасибо скажу. Век живи..
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563524
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slovnet,

на вопрос как использовать результат cte в другом хелп отвечает? при чём здесь ваши извращённые желания умножать делить и тп к синтаксису и bol????
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563540
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

Как использовать результат cte внутри другого cte?
Не нашёл там.
Пожалуйста, укажите литеру примера.
...
Рейтинг: 0 / 0
25 сообщений из 98, страница 1 из 4
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Best practice по сведению двух CTE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]