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

Как использовать результат cte внутри другого cte?
Не нашёл там.
Пожалуйста, укажите литеру примера.
Да хорош уже, какой пример когда там черным по белому вначале написано:

A CTE can reference itself and previously defined CTEs in the same WITH clause. Forward referencing is not allowed.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563552
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slovnet,

Вы можете сылаться внутри СТЕ на другие СТЕ того же блока with как если бы это были внешние таблицы:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create table #T1(C1 decimal(6,2), C2 varchar(20))
insert #T1 values(1,'one'),(2,'two'),(3,'three'),(4,'four'),(5,'five')

;with 
Q0 as
(
 select * from #T1
)
,
Q2 as
(
  select top 3 * from Q0 order by c1 desc
)
,
Q3 as
(
  select top 1 * from Q2 order by C1
)
select * from Q3
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563555
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cammomile,

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

О! Первое конструктивное замечание. Спасибо!
А теперь всё же если не затруднит, пример синтаксиса. Поскольку там такого примера нет.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
;WITH  FirstCTE 
AS 
  (
  SELECT N =  1 
  )
,SecondCTE  
AS 
  (
  SELECT 
    N = F.N + 41 
  FROM FirstCTE F

)
SELECT TheAnswerIs =  N FROM SecondCTE
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563561
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us,

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

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

может Вам это сейчас не надо, но так, просто для информации на будущее:
есть ещё и другой тип применеия/построения CTP: рекурсивные CTP - для работы с иерархическими данными.

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

Спасибо.
Надо будет почитать повнимательней.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563606
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ALL
Человек спросил про запятую, а его 50 постов ногами пинают...

Грамматика SQL вещь сложная, что уж говорить о пунктуации...

2 TS

Есть ещё удобная вещь - присоединение Outer Apply - не так давно, после 10 лет практики в SQL открыл для себя её заново. Когда нужно "добавить к этому одно поле (нацепить на каждую запись некое вычисление)" - это то, что доктор прописал
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563611
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шыфл,

Спасибо.
Впрочем, я не студент, на пинания не обижаюсь. От них только профит, ещё несколько раз проштудировал примеры в хелпе.

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

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

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

Дак вроде уж Вам лично объяснил про схлопывание записей?
вы не можете засунуть DISTINCT в OUTER APPLY?
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563638
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дорогие специалисты MSSQL!
Спасибо вам всем, ответившим в этой ветке.
И помогавшим, и критиковавшим - спасибо.
Благодаря вам новичок в MSSQL не только нашёл решение конкретной задачи, но и узнал много нового о CTE и вообще.

Приходите ещё в мои ветки, у меня очевидно будет ещё много вопросов.

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

Ежели я в инлайн функции объявил несколько ОТВ, притом, эти ОТВ, скажем так "справочники" (датасет детерменирован)
Типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
 
;WITH Types AS
(
SELECT Type =  10001  
UNION
SELECT Type =  10002  
UNION
SELECT Type =  10003
) 




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

С этого места, пожалуйста, поподробней.
Где в этом коде вставлять дистинкт?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
WITH 
t AS (
  SELECT
     PartName, Ordname, Date, Qnt, WorkOrder
     [rn] = ROW_NUMBER() OVER (PARTITION BY [PartName] ORDER BY [date)
)
SELECT
  *
FROM
  t t1
  OUTER APPLY (
     SELECT
       [AllocatedQnt] = SUM(Qnt)
     FROM
        t t2
     WHERE
       t2.[PartName] = t1.[PartName]
       AND t2.[rn] <= t1.[rn]
  ) alloc



А если выборка t включает размноженные строки с разными нумераторами rn, поскольку на каждый Ordname есть несколько WorkOrder's, а нарастающий итог надо посчитать по заказам?
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563658
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cammomile,

Просто написать инлайн функцию и надеяться, что она сама собой станет детерминированной, недостаточно.
Как минимум надо объявить её SCHEMABINDING
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563680
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cammomile

авторИ эту инлайн функцию я накидываю на какой-то селект, серва догадается, что эти ОТВ на каждую строку входного запроса вернут один и тот же датасет и закеширует, или как дурак будет делать рассчеты стопицот миллионов раз?

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

Мне правда интересно насчёт DISTINCT в OUTER APPLY.
Отпишитесь пожалуйста по моему примеру. 21004192
Может там правда можно было какой DISTINCT засунуть и код укоротить?

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

slovnetА если выборка t включает размноженные строки с разными нумераторами rn, поскольку на каждый Ordname есть несколько WorkOrder's, а нарастающий итог надо посчитать по заказам?
*картинка WHAAT?!*
Вы сами-то понимаете, чего вы хотите? "Рисуйте" в excel исходные данные и конечный результат. А гадать по вашим скриптам (которые вы кстати предоставили спустя 5 постов) наши местные телепаты устают.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563907
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан ДамировичslovnetМожет там правда можно было какой DISTINCT засунуть и код укоротить?
А версия сервера у вас какая? А то и правда ваш код можно покороче переписать.
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4042.0 (X64) Mar 26 2015 21:18:04 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)

По Вашему же совету этот код и использовал в 2008.

Руслан ДамировичПрисутствие DISTINCT в коде, если это не для быстро посмотреть, какие вообще значения (сочетания) есть, - моветон.

Знаю. Как говориться, необходимо но недостаточно.
Руслан ДамировичslovnetА если выборка t включает размноженные строки с разными нумераторами rn, поскольку на каждый Ordname есть несколько WorkOrder's, а нарастающий итог надо посчитать по заказам?
*картинка WHAAT?!*
Вы сами-то понимаете, чего вы хотите? "Рисуйте" в excel исходные данные и конечный результат. А гадать по вашим скриптам (которые вы кстати предоставили спустя 5 постов) наши местные телепаты устают.

Я очень хорошо понимаю что хочу. И много раз здесь объяснял, включая исходный пост.
У меня конечный результат уже "нарисован" в Results а не в excel .
Гадать не надо, сразу объяснил. Могу ещё объяснить если вдруг надо.

Скрипт, мной предоставленный - он не мой, а Ваш (с моими косметическими изменениями) предоставленный мне в посте 20989369 :)
За что Вам ещё раз отдельное спасибо.
Здесь же я его привёл просто для иллюстрации TaPaK о том что DISTINCT не поможет.

P.S. Шож тут гуру такие нервные...
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563919
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот знаешь, товарищ, совет тебе на будущее.
Чтобы местные гуру и не гуру были более дружелюбными, делай ЗАРАНЕЕ воспроизводимое репро. А не пиши словами свои хотелки.
Все скуль задачи решаются на абстрактном уровне, очень редко решение зависит от физических данных.


Поэтому если бы ты свой вопрос оформил бы в виде запускаемого куска кода, то и ответы получил бы быстрее, и желчи было бы заметно меньше.

Посмотри пример нормально оформленного вопроса.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563920
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slovnetИ много раз здесь объяснял, включая исходный пост.
Скрипт, мной предоставленный - он не мой, а Ваш (с моими косметическими изменениями) предоставленный мне в посте
У меня конечный результат уже "нарисован" в Results а не в excel
Сопоставлять ваше имя и ваш вопрос с каким-то другим постом, в котором вам уже дали исчерпывающий ответ (да еще и я)?
slovnetЯ очень хорошо понимаю что хочу.
Не понимаете, или хотите совсем не того, что вываливаете в первом посте. Склоняюсь к тому, что вы просто хотите не думать, а получить ответ, ну или устали, потому что тема тяжелая.
slovnetP.S. Шож тут гуру такие нервные...Так мы тоже не железные. То приходится таблички из картинок извлекать, то скрипты, то угадывать, что автор хотел/сказать, вытягивая из него информацию так, чтобы не обидеть.

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

ОК. Спасибо.
Просто код на деле больно громоздкий там, много очень сводных выборок из разных баз.

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

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


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