Кто-нибудь может объяснить, как работает этот запрос?

Это SQL-запрос для определения N-й по величине зарплаты сотрудников:

SELECT *
FROM emp t
WHERE 1 = (SELECT COUNT(DISTINCT sal)
           FROM emp t2
           WHERE t2.sal > t.sal)

Я не знаю, как он возвращает результат. Если вы поместите 1 в предложение WHERE, оно вернет вторую по величине, а для 2 - третью по величине зарплату и так далее.

Объясните, пожалуйста, вопрос, поскольку я не уверен.

С какой СУБД вы работаете? Вы отметили как Oracle, так и Microsoft SQL Server.

Diado 31.10.2018 12:04

@Diado, хотя отмечать несколько rbms - неправильная привычка, имеет ли это значение в данном случае?

HoneyBadger 31.10.2018 12:05

Очевидно нет.

Diado 31.10.2018 12:08

@Diado Я просто прошу логику, которая будет одинаковой во всех СУБД, поэтому не думаю, что это будет проблемой. Этот запрос будет работать во всех СУБД.

Prakhar Dubey 31.10.2018 13:52

@PrakharDubey В этом случае вам действительно следует использовать только тег sql без каких-либо тегов продукта.

HoneyBadger 31.10.2018 19:49
1
5
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Позвольте мне начать с того, что лучший способ написать запрос:

select e.*
from (select e.*, dense_rank() over (order by sal desc) as seqnum
      from emp e
     ) e
where seqnum = 2;

Что делает ваш запрос? Пошагово:

  • Внешний запрос выполняет сравнение для каждой строки в emp.
  • При сравнении подсчитывается количество различных окладов, превышающих оклад в строке.
  • Строка сохраняется, если есть ровно 1 зарплата больше.

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

Другие вопросы по теме