Size: a a a

SqlCom.ru - Стиль жизни SQL

2020 July 20

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Totmir
Taking fire! Need assistance!
Нужна помощь.

ОБъясните максимально подробно (sql учу ровно день), что происходит в этом запросе и какие данные он возвращает? Описание таблички дам в личку - бот удаляет сообщения со ссылками

USE WTDB;
declare @COLLABORATOR_SUBDIVIZION_ID bigint = 6308792087259208713; --ID подразделения сотрудника
with srec as (
   select
     s.id
     ,s.parent_object_id
     ,s.name
     ,s.code
   from subdivisions s
   where
     s.id=@COLLABORATOR_SUBDIVIZION_ID
   union all
   select
     s.id
     ,s.parent_object_id
     ,s.name
     ,s.code
   from subdivisions s
   join srec
     on srec.parent_object_id=s.id
 )
select
 *
from srec
Начнём с того, что перепишем запрос так:


    select
     s.id
     ,s.parent_object_id
     ,s.name
     ,s.code
   from subdivisions s
   where
     s.id=@COLLABORATOR_SUBDIVIZION_ID
   union all
   select
     s.id
     ,s.parent_object_id
     ,s.name
     ,s.code
   from subdivisions s
   join srec
     on srec.parent_object_id=s.id
источник

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Ilia Zviagin
Начнём с того, что перепишем запрос так:


    select
     s.id
     ,s.parent_object_id
     ,s.name
     ,s.code
   from subdivisions s
   where
     s.id=@COLLABORATOR_SUBDIVIZION_ID
   union all
   select
     s.id
     ,s.parent_object_id
     ,s.name
     ,s.code
   from subdivisions s
   join srec
     on srec.parent_object_id=s.id
Далее, это просто два запроса, поставленных друг другу "на голову", два набора, слитых в один.

Первый

[In reply to Alex Mir]
Начнём с того, что перепишем запрос так:
```
Taking fire! Need assistance!
Нужна помощь.

ОБъясните максимально подробно (sql учу ровно день), что происходит в этом запросе и какие данные он возвращает? Описание таблички дам в личку - бот удаляет сообщения со ссылками

    select
     s.id
     ,s.parent_object_id
     ,s.name
     ,s.code
   from subdivisions s
   where
     s.id=@COLLABORATOR_SUBDIVIZION_ID


и второй

    
   select
     s.id
     ,s.parent_object_id
     ,s.name
     ,s.code
   from subdivisions s
   join srec
     on srec.parent_object_id=s.id
источник

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Totmir
Taking fire! Need assistance!
Нужна помощь.

ОБъясните максимально подробно (sql учу ровно день), что происходит в этом запросе и какие данные он возвращает? Описание таблички дам в личку - бот удаляет сообщения со ссылками

USE WTDB;
declare @COLLABORATOR_SUBDIVIZION_ID bigint = 6308792087259208713; --ID подразделения сотрудника
with srec as (
   select
     s.id
     ,s.parent_object_id
     ,s.name
     ,s.code
   from subdivisions s
   where
     s.id=@COLLABORATOR_SUBDIVIZION_ID
   union all
   select
     s.id
     ,s.parent_object_id
     ,s.name
     ,s.code
   from subdivisions s
   join srec
     on srec.parent_object_id=s.id
 )
select
 *
from srec
Блин, а я неправ.
источник

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Totmir
Taking fire! Need assistance!
Нужна помощь.

ОБъясните максимально подробно (sql учу ровно день), что происходит в этом запросе и какие данные он возвращает? Описание таблички дам в личку - бот удаляет сообщения со ссылками

USE WTDB;
declare @COLLABORATOR_SUBDIVIZION_ID bigint = 6308792087259208713; --ID подразделения сотрудника
with srec as (
   select
     s.id
     ,s.parent_object_id
     ,s.name
     ,s.code
   from subdivisions s
   where
     s.id=@COLLABORATOR_SUBDIVIZION_ID
   union all
   select
     s.id
     ,s.parent_object_id
     ,s.name
     ,s.code
   from subdivisions s
   join srec
     on srec.parent_object_id=s.id
 )
select
 *
from srec
Это -- рекурсивный запрос, для второго дня изучения это вообще противопоказано. Через месяц приходи.
источник

VS

Vasily S. in SqlCom.ru - Стиль жизни SQL
Разбираться в том, как реализована рекурсия на sql то ещё занятие, т. к. нету дебагера в принципе для этого. Но, как посоветовали выше, начинать нужно по шагам. В данном случае в рекурсию следует добавить поле, отсчитывающее такты типа lvl - назвать его, и в ограничение where в рекурсивной части, что после union all, добавить   условие, что шаг не более 1. получить результат - впихнуть во временную табличку - и вот эту уже табличку джойнить с той таблицей которая внешняя, +повторить всю логику что в рекурсивной части исходного запроса. Потом ручками проинсертить  полученный результат с новыми данными и так повторять до полного просветления.
источник

T

Totmir in SqlCom.ru - Стиль жизни SQL
Andrey Listochkin
Совет не по этому запросу, а в целом.

Когда видишь такую простыню sql,

1. выдели в ней подзапросы - куски SQL, которые тебе понятны со школы / универа / курсов (`select … from … where … group by …`)

2. Постарайся понять, что делает каждый из них. Если есть база с данными под рукой, попробуй их там запустиь и посмотри, что в результате приходит.

3. Между этими простыми блоками есть какая-то логическая связь. Попадаются варианты with (select … ), in (select … ), from (select … ) и т.д. Часть связей интуитивно понятна, часть - не очень (`union all` - что это?). Тогда идешь и быстро читаешь в интернете что это за зверь такой c простыми примерами.

Сделаешь так с 2-5ю большими запросами, и будешь чувствовать себя гораздо комфортнее.
Круто! Спасибо за совет
источник

IC

Igor Chizhov in SqlCom.ru - Стиль жизни SQL
Ilia Zviagin
Это -- рекурсивный запрос, для второго дня изучения это вообще противопоказано. Через месяц приходи.
Чтобы понять рекурсию, нужно сначала понять рекурсию?
источник

T

Totmir in SqlCom.ru - Стиль жизни SQL
Igor Chizhov
Чтобы понять рекурсию, нужно сначала понять рекурсию?
Рекурсию из JS знаю
источник

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Totmir
Рекурсию из JS знаю
Считай, что ничего не знаешь.
источник

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Totmir
Рекурсию из JS знаю
Это -- другая рекурсия.
источник

T

Totmir in SqlCom.ru - Стиль жизни SQL
Ilia Zviagin
Считай, что ничего не знаешь.
Штош
источник

T

Totmir in SqlCom.ru - Стиль жизни SQL
Будем вникать!)
источник

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Totmir
Штош
Пока найди себе что-то попроще, чтобы вникать.
источник

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Ilia Zviagin
Далее, это просто два запроса, поставленных друг другу "на голову", два набора, слитых в один.

Первый

[In reply to Alex Mir]
Начнём с того, что перепишем запрос так:
```
Taking fire! Need assistance!
Нужна помощь.

ОБъясните максимально подробно (sql учу ровно день), что происходит в этом запросе и какие данные он возвращает? Описание таблички дам в личку - бот удаляет сообщения со ссылками

    select
     s.id
     ,s.parent_object_id
     ,s.name
     ,s.code
   from subdivisions s
   where
     s.id=@COLLABORATOR_SUBDIVIZION_ID


и второй

    
   select
     s.id
     ,s.parent_object_id
     ,s.name
     ,s.code
   from subdivisions s
   join srec
     on srec.parent_object_id=s.id
@etot_mir , ну или так вот, глянь на первый запрос, понятно, что он делает?
источник

T

Totmir in SqlCom.ru - Стиль жизни SQL
Ilia Zviagin
Пока найди себе что-то попроще, чтобы вникать.
Это одна из задач тестового: рассказать, что там происходит
источник

T

Totmir in SqlCom.ru - Стиль жизни SQL
Ilia Zviagin
@etot_mir , ну или так вот, глянь на первый запрос, понятно, что он делает?
Да
источник

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Totmir
Это одна из задач тестового: рассказать, что там происходит
Если это тестовое не по SQL -- шли нах. Если ПО, то ты просто не пройдёшь и без этого запроса.
источник

T

Totmir in SqlCom.ru - Стиль жизни SQL
Ilia Zviagin
@etot_mir , ну или так вот, глянь на первый запрос, понятно, что он делает?
Выбирает 4 массива из Subdivisions с условием s.id=@COLLABORATOR_SUBDIVIZION_ID
источник

YS

Yaroslav Schekin in SqlCom.ru - Стиль жизни SQL
Ilia Zviagin
Пока найди себе что-то попроще, чтобы вникать.
Recursive CTE — это обычные циклы (с дурацким названием, спасибо ISO SQL), что там "вникать"?
Если программист не может разобраться, как использовать циклы... может, это и не программист вовсе? ;)
Да, в реализации MS SQL (по сравнению со стандартом) есть небольшие косяки (см. документацию), но жить с ними вполне можно.
источник

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Totmir
Да
Вот, тогда глядим на СЛЕДУЮЩИЙ запрос:


      select s.id
     ,s.parent_object_id
     ,s.name
     ,s.code
   from subdivisions s
   join srec
     on srec.parent_object_id=s.id


Это означает буквально следующее:

Для каждой записи из первого запроса (она обозначена как srec)
выбрать из subdivision все записи, у которых s.id равен
srec.parent_object_id
, и затем повторять это для всех записей рекурсивно, пока добавляются новые записи.
источник