#mysql #sql
#mysql #sql
Вопрос:
У меня есть этот sql-запрос, который я пытаюсь понять. Могу ли я получить построчное объяснение, пожалуйста. Я знаю, что первая строка инициализирует переменную. Во второй строке задается минимальное значение.
set @r1=0, @r2=0, @r3=0, @r4=0;
select min(Doctor), min(Professor), min(Singer), min(Actor)
from(
select case when Occupation='Doctor' then (@r1:=@r1 1)
when Occupation='Professor' then (@r2:=@r2 1)
when Occupation='Singer' then (@r3:=@r3 1)
when Occupation='Actor' then (@r4:=@r4 1) end as RowNumber,
case when Occupation='Doctor' then Name end as Doctor,
case when Occupation='Professor' then Name end as Professor,
case when Occupation='Singer' then Name end as Singer,
case when Occupation='Actor' then Name end as Actor
from OCCUPATIONS
order by Name
) Temp
group by RowNumber
Ответ №1:
Переменные перечисляют строки для каждого занятия отдельно. Вы можете убедиться в этом, выполнив подзапрос, чтобы увидеть результаты.
Он выполняет эквивалент:
select max(case when occupation = 'Doctor' then name end) as doctor,
max(case when occupation = 'Professor' then name end) as professor,
max(case when occupation = 'Singer' then name end) as singer,
max(case when occupation = 'Actor' then name end) as actor
from (select o.*,
row_number() over (partition by occupation order by name) as seqnum
from occupations o
) o
group by seqnum;
Это лучший способ написать запрос в MySQL 8 , потому что такое использование переменных устарело. Что он делает, так это помещает занятия в отдельные столбцы:
occupation name
doctor A
doctor B
singer C
Превращается в:
doctor professor singer actor
A C
B
Промежуточный шаг — это:
occupation name seqnum
doctor A 1
doctor B 2
singer C 1
Комментарии:
1. что делает Temp перед последней строкой. Также не могли бы вы объяснить, что (затем название end) Я буду признателен, если вы сможете подробнее объяснить свой запрос или направить меня к некоторым документам.
2. @FrankDax . . . Это псевдоним таблицы.
3. Также не могли бы вы объяснить, что (затем название end) Я буду признателен, если вы сможете подробнее объяснить свой запрос или направить меня к некоторым документам
4. @FrankDax . .
case
выражения являются базовой частью языка SQL и рассматриваются в любой документации: dev.mysql.com/doc/refman/8.0/en/case.html .