Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
 Re: Best practice по сведению двух CTE  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
slovnet
TaPaK,

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

Да хорош уже, какой пример когда там черным по белому вначале написано:

A CTE can reference itself and previously defined CTEs in the same WITH clause. Forward referencing is not allowed.
4 дек 17, 11:28    [21003569]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
Alexander Us
Member

Откуда:
Сообщений: 1130
slovnet,

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

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
4 дек 17, 11:34    [21003600]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
Cammomile,

О! Первое конструктивное замечание. Спасибо!
А теперь всё же если не затруднит, пример синтаксиса. Поскольку там такого примера нет.
4 дек 17, 11:38    [21003618]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
slovnet
Cammomile,

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


;WITH  FirstCTE 
AS 
  (
  SELECT N =  1 
  )
,SecondCTE  
AS 
  (
  SELECT 
    N = F.N + 41 
  FROM FirstCTE F

)
SELECT TheAnswerIs =  N FROM SecondCTE
4 дек 17, 11:42    [21003643]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
Alexander Us,

Спасибо!
Это именно то что вчера сделал.
То есть изначально искал несколько другое решение, но именно приведенный Вами синтаксис решил мою задачу.
4 дек 17, 11:42    [21003644]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
Cammomile,

Спасибо.
Видите как просто было помочь человеку. Сколько воды зря перемолотили здесь (не имею в виду именно Вас).
4 дек 17, 11:49    [21003682]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
Alexander Us
Member

Откуда:
Сообщений: 1130
slovnet,

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

Там изнутри CTP ссылаются на сам CTP.
4 дек 17, 11:59    [21003735]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
Alexander Us,

Спасибо.
Надо будет почитать повнимательней.
4 дек 17, 12:05    [21003773]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
2 ALL
Человек спросил про запятую, а его 50 постов ногами пинают...

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

2 TS

Есть ещё удобная вещь - присоединение Outer Apply - не так давно, после 10 лет практики в SQL открыл для себя её заново. Когда нужно "добавить к этому одно поле (нацепить на каждую запись некое вычисление)" - это то, что доктор прописал
4 дек 17, 12:29    [21003912]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
Шыфл,

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

Да, Outer Apply я использую, но в чистом виде оно мне было недостаточно.
4 дек 17, 12:37    [21003966]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
slovnet,

а чего же в APPLY вам не хватило то?
4 дек 17, 12:44    [21004001]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
TaPaK,

Дак вроде уж Вам лично объяснил про схлопывание записей?
4 дек 17, 12:59    [21004060]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
slovnet
TaPaK,

Дак вроде уж Вам лично объяснил про схлопывание записей?

вы не можете засунуть DISTINCT в OUTER APPLY?
4 дек 17, 13:08    [21004101]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
Дорогие специалисты MSSQL!
Спасибо вам всем, ответившим в этой ветке.
И помогавшим, и критиковавшим - спасибо.
Благодаря вам новичок в MSSQL не только нашёл решение конкретной задачи, но и узнал много нового о CTE и вообще.

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

Ифчо, задача решена ещё вчера, но если ещё кому надо "попинать студента", налетай, обслужу :)
4 дек 17, 13:08    [21004102]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
А я вот сижу, и думаю.

Ежели я в инлайн функции объявил несколько ОТВ, притом, эти ОТВ, скажем так "справочники" (датасет детерменирован)
Типа
 
;WITH Types AS
(
SELECT Type =  10001  
UNION
SELECT Type =  10002  
UNION
SELECT Type =  10003
) 



И эту инлайн функцию я накидываю на какой-то селект, серва догадается, что эти ОТВ на каждую строку входного запроса вернут один и тот же датасет и закеширует, или как дурак будет делать рассчеты стопицот миллионов раз?
4 дек 17, 13:17    [21004136]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
TaPaK,

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

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, а нарастающий итог надо посчитать по заказам?
4 дек 17, 13:30    [21004192]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Cammomile,

Просто написать инлайн функцию и надеяться, что она сама собой станет детерминированной, недостаточно.
Как минимум надо объявить её SCHEMABINDING
4 дек 17, 13:33    [21004205]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Cammomile

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

инлайн функция не вычисляетя "каждый раз", отдаёт план аналогичный обычному представлению.
4 дек 17, 13:54    [21004288]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
TaPaK,

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

Заранее спасибо.
4 дек 17, 16:20    [21004885]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
slovnet
Может там правда можно было какой DISTINCT засунуть и код укоротить?

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

slovnet
А если выборка t включает размноженные строки с разными нумераторами rn, поскольку на каждый Ordname есть несколько WorkOrder's, а нарастающий итог надо посчитать по заказам?

*картинка WHAAT?!*
Вы сами-то понимаете, чего вы хотите? "Рисуйте" в excel исходные данные и конечный результат. А гадать по вашим скриптам (которые вы кстати предоставили спустя 5 постов) наши местные телепаты устают.
4 дек 17, 16:30    [21004925]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
Руслан Дамирович
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. Шож тут гуру такие нервные...
4 дек 17, 17:01    [21005027]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Вот знаешь, товарищ, совет тебе на будущее.
Чтобы местные гуру и не гуру были более дружелюбными, делай ЗАРАНЕЕ воспроизводимое репро. А не пиши словами свои хотелки.
Все скуль задачи решаются на абстрактном уровне, очень редко решение зависит от физических данных.


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

Посмотри пример нормально оформленного вопроса.
4 дек 17, 17:13    [21005064]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
slovnet
И много раз здесь объяснял, включая исходный пост.
Скрипт, мной предоставленный - он не мой, а Ваш (с моими косметическими изменениями) предоставленный мне в посте
У меня конечный результат уже "нарисован" в Results а не в excel

Сопоставлять ваше имя и ваш вопрос с каким-то другим постом, в котором вам уже дали исчерпывающий ответ (да еще и я)?
slovnet
Я очень хорошо понимаю что хочу.

Не понимаете, или хотите совсем не того, что вываливаете в первом посте. Склоняюсь к тому, что вы просто хотите не думать, а получить ответ, ну или устали, потому что тема тяжелая.
slovnet
P.S. Шож тут гуру такие нервные...
Так мы тоже не железные. То приходится таблички из картинок извлекать, то скрипты, то угадывать, что автор хотел/сказать, вытягивая из него информацию так, чтобы не обидеть.

А теперь давайте сделаем ребут.
Вы выложите данные еще раз. Еще раз нарисуете результат. И скрипт, который что-то там делает, но этого результата не дает. А уж мы постараемся помочь.
Это конструктивнее, чем выяснять, кто прав, а кто злой.
4 дек 17, 17:14    [21005067]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
Cammomile,

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

Но на будущее буду знать. Хотя вот рядом товарищ утверждает что по скриптам гадать не будут, надо пример результата в екселе, говорит, рисовать.
4 дек 17, 17:32    [21005103]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Ну ты же можешь упростить до вменяемого уровня!

Нафига нам проникать мозгом твои сложные структуры, когла концептуально вопрос о том, как юзать ссылки цте на цте и аплаи?
4 дек 17, 17:36    [21005119]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить