Ошибка получения ‘Неизвестного столбца ‘Dense_Rank’ в ‘предложении where’ в MySQL Workbench

#mysql #sql

#mysql #sql

Вопрос:

Впервые публикую здесь, поэтому я хотел бы заранее поблагодарить всех за их помощь.

Я пытаюсь ранжировать записи таблицы и дополнительно указать выходные данные, используя предложение WHERE. Однако я получаю сообщение об ошибке, указанное в заголовке моего поста.

 SELECT Name, Gender, Salary,
RANK() OVER (ORDER BY Salary DESC) AS `Rank`,
DENSE_RANK() OVER (ORDER BY salary DESC) AS `Dense_Rank`
FROM employees
;
  

Выдает результат, видимый здесь. Проще простого.

Когда я затем добавляю предложение WHERE:

 SELECT Name, Gender, Salary,
RANK() OVER (ORDER BY Salary DESC) AS `Rank`,
DENSE_RANK() OVER (ORDER BY salary DESC) AS `Dense_Rank`
FROM employees
WHERE `Dense_Rank` = 2
;
  

Я получаю ‘Код ошибки: 1054. Неизвестный столбец ‘Dense_Rank’ в ‘предложении where’

Я пробовал разные методы, чтобы получить результат; опуская обратные ссылки и используя другой псевдоним, используя HAVING вместо WHERE — безуспешно. Пожалуйста, подождите.

Комментарии:

1. Вы не можете использовать псевдоним столбца в where предложении. Используйте подзапрос.

Ответ №1:

Вам нужно использовать подзапрос;

 Select * from
(
SELECT Name, Gender, Salary,
RANK() OVER (ORDER BY Salary DESC) AS `Rank`,
DENSE_RANK() OVER (ORDER BY salary DESC) AS `Dense_Rank`
FROM employees
) X
WHERE `Dense_Rank` = 2
  

Комментарии:

1. Черт возьми, это сработало отлично — спасибо! Вы не могли бы объяснить, почему это должно было быть в подзапросе? Или укажите мне направление источника для чтения?

2. Reektheunbroken, потому что в стандартном SQL вы не сможете ссылаться на псевдоним столбца в предложении WHERE. Вот почему вы можете использовать подзапрос.

Ответ №2:

Вы не можете использовать псевдоним столбца в where предложении. MySQL расширяет использование having , поэтому вы можете использовать это:

 SELECT Name, Gender, Salary,
       RANK() OVER (ORDER BY Salary DESC) AS `Rank`,
       DENSE_RANK() OVER (ORDER BY salary DESC) AS `Dense_Rank`
FROM employees
HAVING `Dense_Rank` = 2
  

Комментарии:

1. Как ни странно, когда я использовал HAVING, я получил совершенно другое сообщение об ошибке: Код ошибки: 3594. Вы не можете использовать псевдоним ‘Dense_Rank’ выражения, содержащего функцию window в этом контексте.’