powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите понять что делает данный запрос
19 сообщений из 19, страница 1 из 1
Помогите понять что делает данный запрос
    #40026459
Alex0928
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
В качестве тестового задания дали пример запроса. Нужно объяснить что он делает и какие данные получатся на выходе.
Помогите пожалуйста.
SQL начал изучать только недавно. И вообще, если можно оцените его по каким-то критериям сложности. Сколько нужно потратить времени на изучение sql, чтобы с легкостью понимать такие запросы.

Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
with V1 as (
             select a.*,
                    0 level,
                    a.[_IDRRef] source_id
             from _Reference105X1 a
             join _Enum403 e  on a.[_Fld9604RRef] = e.[_IDRRef]
             where a._Marked = 0
             and _Fld9602 > '0'
             and a._Fld675 = 0      
             and e.[_EnumOrder] in (0, 2, 4, 6)
            
             union all
            
             select a.*,
                    level + 1 level,
                    source_id
               from _Reference105X1 a
               join V1 b
                 on a.[_IDRRef] = b.[_ParentIDRRef]
                 and a._Fld675 = 0
--           and a._Marked  = 0                 
       ),
      
V2 AS
(
   select *,
             max(level) over (partition by source_id) max_level
       from V1
),

V3 AS
(
SELECT      
        SOURCE_ID,
--   max_level,
--   level,

       max(
            case
                    when max_level between 1 and 9  and level = max_level then _IDRRef
         end
       ) "LVL1_ID",
       max(
             case
                    when max_level between 1 and 9  and level = max_level then _Description
             end
       ) "LVL1_DESCR",
       max(
             case
                 when max_level between 2 and 9  and level = max_level-1 then _IDRRef
             end
       ) "LVL2_ID",
       max(
             case
                 when max_level between 2 and 9  and level = max_level-1 then _Description
             end
       ) "LVL2_DESCR",
       max(
             case
                 when max_level between 3 and 9  and level = max_level-2 then _IDRRef
             end
       ) "LVL3_ID",
       max(
             case
                 when max_level between 3 and 9  and level = max_level-2 then _Description
             end
       ) "LVL3_DESCR",
       max(
             case
                 when max_level between 4 and 9  and level = max_level-3 then _IDRRef
             end
       ) "LVL4_ID",
       max(
             case
                 when max_level between 4 and 9  and level = max_level-3 then _Description
             end
       ) "LVL4_DESCR",
      
       Max( iif(level = 0, _fld9602,     null ) )   Артикул,
       Max( iif(level = 0, _Description, null ) )   Номенклатура,
       Max( iif(level = 0, _Fld9626RRef, null ) )   TradeMarkID
       from V2
       group by source_id
),

V4 AS
(
   SELECT
        V3.*,
             TM._Description                     ТоварнаяМарка
     FROM V3
     LEFT  JOIN _Reference188  TM       
       ON  TM._IDRRef = V3.TradeMarkID
         AND  TM._Fld675 = 0               
)

SELECT * FROM V4
...
Рейтинг: 0 / 0
Помогите понять что делает данный запрос
    #40026465
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex0928
и какие данные получатся на выходе

Полную структуру таблиц с констрейнтами предоставили? Если нет, то правильный ответ - неизвестно.

Одна только строчка
Alex0928
Код: sql
1.
and _Fld9602 > '0'


показывает, что из конторы с такими запросами надо бежать и как можно скорее
...
Рейтинг: 0 / 0
Помогите понять что делает данный запрос
    #40026473
4es
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
4es
Гость
env
Одна только строчка
Alex0928
Код: sql
1.
and _Fld9602 > '0'


показывает, что из конторы с такими запросами надо бежать и как можно скорее

Это структура базы 1С

Кстати говоря, прямая работа с объектами БД 1С – нарушение пользовательского соглашения.
И если после очередного обновления в структуре что-то поменяется, то запрос отвалится.
...
Рейтинг: 0 / 0
Помогите понять что делает данный запрос
    #40026550
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex0928
Сколько нужно потратить времени на изучение sql, чтобы с легкостью понимать такие запросы.
В запросе никаких хитростей нет.
Используются обычные джойны, группировки, условия.
Текст большой, но семантически запрос очень простой.

Что бы изучить такие конструкции, нужен месяц, ну пусть до трёх (или никогда, если нет способностей).

Но что бы запомнить все эти таблицы, держать в памяти, и быстро читать подобные запросы ("какие данные получатся на выходе"), нужен некий навык работы с этой системой (очевидно, 1С), потребуется времени побольше, может, год, может, больше (у кого как).
...
Рейтинг: 0 / 0
Помогите понять что делает данный запрос
    #40026561
Alex0928
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg
Alex0928
Сколько нужно потратить времени на изучение sql, чтобы с легкостью понимать такие запросы.

Но что бы запомнить все эти таблицы, держать в памяти, и быстро читать подобные запросы ("какие данные получатся на выходе"), нужен некий навык работы с этой системой (очевидно, 1С), потребуется времени побольше, может, год, может, больше (у кого как).

ох спасибо ) вы меня обрадовали ))

Ну а все же, хотя бы в кратце, можете написать, что этот запрос делает?
...
Рейтинг: 0 / 0
Помогите понять что делает данный запрос
    #40026603
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex0928
alexeyvg
пропущено...

Но что бы запомнить все эти таблицы, держать в памяти, и быстро читать подобные запросы ("какие данные получатся на выходе"), нужен некий навык работы с этой системой (очевидно, 1С), потребуется времени побольше, может, год, может, больше (у кого как).

ох спасибо ) вы меня обрадовали ))

Ну а все же, хотя бы в кратце, можете написать, что этот запрос делает?
навскидку перед сном

сначала в V1 в первой части отбираются какие-то корневые данные,
а потом ищутся под них дети on a.[_IDRRef] = b.[_ParentIDRRef]

в v3 получается какой-то аналог pivot-а сразу для нескольких различных уровней, на которых закончился поиск детей
причем подразумевается, что максимальный уровень детства - 9
...
Рейтинг: 0 / 0
Помогите понять что делает данный запрос
    #40026613
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
никто не мешает попытаться создать тестовые данные и побаловаться (и заодно привести запрос в более удобоваримый вид)

Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
with
_Reference188 as
(
select 1 _IDRRef, 0 _Fld675, 'TM._Description_1' _Description union all
select 2 _IDRRef, 0 _Fld675, 'TM._Description_2' _Description
)
,
_Reference105X1 as(
select 1 [_Fld9604RRef], '2' _Fld9602, 0 _Fld675, 0 _Marked, null [_IDRRef], 1 [_ParentIDRRef], '_Description' _Description, 1 _Fld9626RRef union all
select 1 [_Fld9604RRef], '2' _Fld9602, 0 _Fld675, 0 _Marked, 1    [_IDRRef], 2 [_ParentIDRRef], '_Description' _Description, 2 _Fld9626RRef 
),
_Enum403 as (
select 1 [_IDRRef], 0 [_EnumOrder]
),
V1 as (
             select a.*,
                    0 level,
                    a.[_IDRRef] source_id
             from _Reference105X1 a
             join _Enum403 e  on a.[_Fld9604RRef] = e.[_IDRRef]
             where a._Marked = 0
             and _Fld9602 > '0'
             and a._Fld675 = 0      
             and e.[_EnumOrder] in (0, 2, 4, 6)
            
             union all
            
             select a.*,
                    level + 1 level,
                    source_id
               from _Reference105X1 a
               join V1 b
                 on a.[_IDRRef] = b.[_ParentIDRRef]
                 and a._Fld675 = 0
--           and a._Marked  = 0                 
       ),
      
V2 AS
(
   select *,
             max(level) over (partition by source_id) max_level
       from V1
),

V3 AS
(
SELECT      
        SOURCE_ID,
--   max_level,
--   level,

       max(case when max_level between 1 and 9  and level = max_level   then _IDRRef         end) "LVL1_ID",
       max(case when max_level between 1 and 9  and level = max_level   then _Description    end) "LVL1_DESCR",
       max(case when max_level between 2 and 9  and level = max_level-1 then _IDRRef         end) "LVL2_ID",
       max(case when max_level between 2 and 9  and level = max_level-1 then _Description    end) "LVL2_DESCR",
       max(case when max_level between 3 and 9  and level = max_level-2 then _IDRRef         end) "LVL3_ID",
       max(case when max_level between 3 and 9  and level = max_level-2 then _Description    end) "LVL3_DESCR",
       max(case when max_level between 4 and 9  and level = max_level-3 then _IDRRef         end) "LVL4_ID",
       max(case when max_level between 4 and 9  and level = max_level-3 then _Description    end) "LVL4_DESCR",
      
       Max( iif(level = 0, _fld9602,     null ) )   Артикул,
       Max( iif(level = 0, _Description, null ) )   Номенклатура,
       Max( iif(level = 0, _Fld9626RRef, null ) )   TradeMarkID
       from V2
       group by source_id
),

V4 AS
(
SELECT V3.*,
       TM._Description                     ТоварнаяМарка
  FROM V3
  LEFT JOIN _Reference188  TM   ON  TM._IDRRef = V3.TradeMarkID AND  TM._Fld675 = 0               
)

SELECT * FROM V4
...
Рейтинг: 0 / 0
Помогите понять что делает данный запрос
    #40026649
Alex0928
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я так понимаю что все-таки запрос достаточно сложный, раз никто не может ответить )
...
Рейтинг: 0 / 0
Помогите понять что делает данный запрос
    #40026651
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex0928,

рекомендую спросить того, кто дал/написал этот запрос,
как вариант - посидеть с конфигуратором/обработкой 1С, переводя имена таблиц в имена сущностей,
потом посидеть в msdn, читая о неизвестных вам ключевых словах

или вам в форум "Работа"
...
Рейтинг: 0 / 0
Помогите понять что делает данный запрос
    #40026654
Alex0928
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Критик
Alex0928,
как вариант - посидеть с конфигуратором/обработкой 1С, переводя имена таблиц в имена сущностей,
или вам в форум "Работа"

Я получил этот запрос на почту, у меня нет доступа к базе.
Я просто не могу понять, видя такой запрос и имея некий опыт в sql реально объяснить что он делает?
Или это такое задание с подвохом?
...
Рейтинг: 0 / 0
Помогите понять что делает данный запрос
    #40026702
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex0928,

Реально и вам даже уже ответили. Основная и единственная сложность при ответе - отсутствие информации о структурах таблиц, объявленных связях и характере данных.

з.ы.
можете ответить, что запрос показывает архитектурные проблемы - хранение чисел в строках, и проблемы с организацией разработки - в запросе явно видно отсутствие единого code style.
...
Рейтинг: 0 / 0
Помогите понять что делает данный запрос
    #40026707
Uridian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
архитектурные проблемы - хранение чисел в строках

Обычный для 1С способ вести автонумерацию с сохранением ведущих нулей. При подобной строковой идентификации, у бухгалтерии есть возможность на основании автоматического документа "000123" создать ручной "000123/Ф12", и система его позволит сохранить.
...
Рейтинг: 0 / 0
Помогите понять что делает данный запрос
    #40026712
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Uridian,

И по этим номерам часто идёт сравнение больше/меньше?
...
Рейтинг: 0 / 0
Помогите понять что делает данный запрос
    #40026714
Uridian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
отсутствие единого code style.

Запрос, вероятно, мог быть написан на языке 1С, и "переведен" на SQL автоматически. Так что, code style этот принадлежит "переводчику".
...
Рейтинг: 0 / 0
Помогите понять что делает данный запрос
    #40026717
Uridian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env

И по этим номерам часто идёт сравнение больше/меньше?

Не знаю, возможно при любой сортировке/выводе. В данном запросе номера сравниваются с константой, а не между собой.
...
Рейтинг: 0 / 0
Помогите понять что делает данный запрос
    #40026723
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Uridian,

Uridian
В данном запросе номера сравниваются с константой

Возможно, знатокам 1С _Fld9602 явно указывает на содержимое, спорить не буду. Вопрос в другом - сравнение ожидается по правилам для строк? Для чисел?

Если для строк, то не проще ли было написать
Код: sql
1.
<> '0'

? Т.к. даже '00' будет > '0'
А если для чисел - то косяк с неявной конвертацией типов.

Код: 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.
with t as 
    (
        select 
            0 as n
        union all 
        select 
            n+1 as n 
        from 
           t 
        where 
            n<10
    ),
tt as 
    (
        select 
            format(n,'0#') as m 
        from 
            t
    )
select 
    m
from 
    tt 
where 
    m > '0';




Uridian
Так что, code style этот принадлежит "переводчику".

Вряд ли автомат один и тот же max напишет тремя разными способами, не говоря о смене регистра в разных частях запроса и использования одновременно двойных кавычек и квадратных скобок.
...
Рейтинг: 0 / 0
Помогите понять что делает данный запрос
    #40026726
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
Вряд ли автомат один и тот же max напишет тремя разными способами, не говоря о смене регистра в разных частях запроса и использования одновременно двойных кавычек и квадратных скобок
взяли у автомата, а потом "улучшили"
...
Рейтинг: 0 / 0
Помогите понять что делает данный запрос
    #40026728
0wl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
0wl
Гость
Uridian,

Странный запрос.

Структура данных - явно 1С, но платформа CTE в запросах писать не умеет, это явно вручную написали.

V1-V3 разворачивают "иерархический" справочник в плоский список. То есть, было
Обувь
-- Фабрика Скороход
--- сапоги

Стало:
Обувь | Фабрика Скороход | Сапоги


Причем, справочник (_Reference) выбирается не весь, а с отбором по значениям некоего Перечисления (_Enum)
Потом развёрнутая иерархия соединяется с ещё одним справочником.


Не очень понятно, что ждёт от вас интервьюер. Далеко не все 1С-ники знают, что "Справочник" хранится в таблицах с префиксом "_Reference". С SQL-щиками наоборот: им не очень интересно, какие объекты 1С стоят за безликими таблицами.

В целом, как выше сказали, 2-3 месяца изучения SQL (из самого неочевидного здесь - рекурсивная CTE), плюс изучение структуры 1С - тут те же пара месяцев практики с сопоставлением запроса на языке 1С и того, что отправляется в СУБД. Тогда вещи типа "_ParentIDRRef" (ссылка на "родителя" в иерархии) или "a._Fld675 = 0" (скорее всего - отбор по "Разделителю учета") будут считываться автоматически
...
Рейтинг: 0 / 0
Помогите понять что делает данный запрос
    #40026752
Uridian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
по правилам для строк?не проще ли было написать [src]<> '0'

Для строк, конечно.
Могу только предположить, что разработчик хотел отобрать номера с (минимум одним) ведущим нулем + ещё какими-то символами, в тч дополнительными ведущими нулями.

env
Вряд ли автомат один и тот же max напишет тремя разными способами, не говоря о смене регистра в разных частях запроса и использования одновременно двойных кавычек и квадратных скобок.
Ответили выше)).

0wl
Uridian,
что ждёт от вас интервьюер.

Скорее от топик-стартера.))
Мне "посчастливилось" раньше править SQL-код, по которому видно, что человек учился этому языку на "примерах" от 1С. То есть, имена таблиц уже нормальные, Sales, Orders и тп, а структура запроса - глубоко вложенные подзапросы, причём сохранены типично 1С-овские "code style" с переносами строк после каждого поля, и тд.
В данном запросе просто взят некий рабочий пример, в котором для экзаменационных целей поленились заменить имена таблиц на тестовые. Работодатель хочет определить, сможет ли в этом, простите, г@, разобраться соискатель.)) Ведь ему предстоит потом в нем плавать.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите понять что делает данный запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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