ORACLE SQL: Может кто-нибудь объяснить мне разницу между этими двумя? - PullRequest
1 голос
/ 07 мая 2020

Я студент и это мой первый год обучения Oracle SQL. На экзамене я использовал этот код:

SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING INSTR(TO_CHAR(department_id),'5')!=1 AND MAX(salary)<1000;

, и профессор сказал, что я должен использовать что-то вроде

SELECT DEPARTMENT_ID, MAX(SALARY)
FROM EMPLOYEES
WHERE SUBSTR(TO_CHAR(DEPARTMENT_ID),1,1)<>'5'
GROUP BY DEPARTMENT_ID
HAVING MAX(SALARY) < 1000;

У нас одна и та же таблица, поэтому мой вопрос, когда эти два может отображать разные результаты. Я знаю, что обработка данных другая, но, как он сказал, проблема не в этом. Проблема не в использовании функции INSTR, а в использовании WHERE.

1 Ответ

1 голос
/ 07 мая 2020

Предложение Where работает с необработанным содержимым строк, поэтому вы фильтруете набор данных, который оценивается для предложения select

 WHERE SUBSTR(TO_CHAR(DEPARTMENT_ID),1,1)<>'5'

не выбирайте строки с помощью

SUBSTR(TO_CHAR(DEPARTMENT_ID),1,1)='5' 

поэтому эти строки не используются для

SELECT DEPARTMENT_ID, MAX(SALARY) ..GROUP BY DEPARTMENT_ID

ИМЕЮТ работу с результатом выбранного результата, поэтому также должны быть обработаны строки с SUBSTR (TO_CHAR (DEPARTMENT_ID), 1,1) = '5'

в вашем случае всегда выбирается каждое значение для столбца DEPARTMENT_ID, потому что оно упоминается в группе by, а затем оба запроса должны возвращать тот же результат

...