Потеря соединения в связанных запросах.
select emp_no,salary
from salaries e
where 2 =
(select count(distinct salary) from salaries p where p.salary>e.salary);
Я попробовал это, чтобы получить вторую по величине зарплату, но каждый раз у меня терялось соединение с SQL. Все остальные запросы работают нормально, кроме этого.
Я использую рабочую среду sql.
Прикрепил: Скриншот ошибки
Я не думаю, что ваш SQL даст вам желаемый результат, но это второстепенный вопрос. Чтобы устранить эту ошибку, просто увеличьте настройку таймаута: https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_net_read_timeout
А потом ждать, даже дольше 30 секунд, пока не появится ошибка? Лучшим вариантом по-прежнему будет использование правильного запроса.
Похоже, что время ожидания соединения составляет 30 секунд, а неэффективный запрос занимает слишком много времени. Этот способ намного быстрее и должен завершиться до истечения времени ожидания:
SELECT emp_no, salary
FROM
(
select emp_no,salary,row_number() over (order by salary desc) rn
from salaries e
) t
WHERE rn = 2
В конце концов, если MySQL правильно реализует ключевое слово ANSI QUALIFY
, это может потребовать еще меньше кода и работать даже немного быстрее.
При наличии нескольких сотрудников с одинаковой зарплатой запрос отображает только одного из них.
@slaakso Если это имеет значение, достаточно просто поменять row_number()
на dense_rank()
Это был бы лучший ответ
Это немного запутанно, но вы можете избежать такого order by
:
select emp_no, salary
from salaries
where salary = (
select max(salary)
from salaries
where salary != (
select max(salary)
from salaries
)
)
По какой-то причине это работает лучше: select i from integers where i=(select max(i) from integers where i < (select max(i) from integers));
(изменено !=
на <
)
Еще один вариант с использованием ключевого слова LIMIT
+ OFFSET
:
SELECT emp_no,
salary
FROM salaries
ORDER BY salary DESC
LIMIT 1 OFFSET 1
Если у вас может быть более двух записей со второй по величине зарплатой, ответ Джоэла более подходит, но при этом следует изменить оконную функцию на DENSE_RANK
вместо ROW_NUMBER
.
Сообщить нам, что база данных представляет собой SQL Workbench, это все равно, что сообщить нам, на какой марке автомобиля вы ездите, основываясь на логотипе бренда, показанном на радиоприемнике на приборной панели. Для некоторых это нормально, но настораживает ваш механик.