2016-12-11 2 views
0

Используя следующий вопрос, пожалуйста, объясните мне, в чем разница между двумя SQL и почему у них нет такого же результата?Почему один запрос возвращает больше, чем другие

Отобразите фамилию, название отдела и зарплату любого сотрудника, чья зарплата и комиссия соответствуют зарплате и комиссии любого сотрудника, расположенного в местоположении ID1700.

SELECT E.LAST_NAME, D.DEPARTMENT_NAME, E.SALARY 
    FROM EMPLOYEES E 
    JOIN DEPARTMENTS D 
    ON (E.DEPARTMENT_ID =D.DEPARTMENT_ID) 
    WHERE E.SALARY IN (SELECT SALARY 
         FROM EMPLOYEES 
         WHERE D.LOCATION_ID = 1700) AND 
     E.COMMISSION_PCT IN (SELECT COMMISSION_PCT 
           FROM EMPLOYEES 
           WHERE D.LOCATION_ID = 1700); 

(0) выходы

и

SELECT e.last_name, d.department_name, e.salary 
    FROM employees e, 
     departments d 
    WHERE e.department_id = d.department_id AND 
     (salary, NVL(commission_pct,0)) IN (SELECT salary, 
                NVL(commission_pct,0) 
               FROM employees e, 
                departments d 
               WHERE e.department_id = d.department_id AND 
                d.location_id = 1700); 

(36 выходов)

+0

В какой базе данных вы фактически используете? Я предполагаю, что Oracle, и я также предполагаю, что это проблема домашних заданий. –

+0

Да, Oracle DB. Im пытается выяснить, почему 0 выходов один не работает. (я сам это написал). Решение вопроса состоит из 36 выходов. Я не знаю, почему тип SQL i неправильный, выглядит корректно для меня, но, по-видимому, не основан на результатах. –

+0

Добавьте некоторые данные таблицы образцов и текущие два результата. (Также форматированный текст.) Также покажите нам желаемый результат. – jarlh

ответ

2

Обратите внимание, что этот запрос:

SELECT e.last_name, d.department_name, e.salary 
    FROM employees e, 
     departments d 
    WHERE e.department_id = d.department_id AND 
     (salary, NVL(commission_pct,0)) IN (SELECT salary, 
                NVL(commission_pct,0) 
               FROM employees e, 
                departments d 
               WHERE e.department_id = d.department_id AND 
                d.location_id = 1700); 

... будет включать в себя любой сотрудник, имеющий тот же зарплату и комиссию, как кто-то в месте 1700. По последним данным все сотрудники в местоположении 1700 будут включены в результирующий набор. Но другие сотрудники, не в том месте, могут быть найдены, если есть только кто-то в месте 1700, который имеет точно такую ​​же зарплату и комиссию. Таким образом, этот запрос правильно отвечает заданному заданию.

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

SELECT E.LAST_NAME, D.DEPARTMENT_NAME, E.SALARY 
    FROM EMPLOYEES E 
    JOIN DEPARTMENTS D 
    ON (E.DEPARTMENT_ID =D.DEPARTMENT_ID) 
    WHERE E.SALARY IN (SELECT SALARY 
         FROM EMPLOYEES 
         WHERE D.LOCATION_ID = 1700) AND 
     E.COMMISSION_PCT IN (SELECT COMMISSION_PCT 
           FROM EMPLOYEES 
           WHERE D.LOCATION_ID = 1700); 

вы не ничего существенного изменится, если вы бы двигаться, что условие на location_id во внешнем where пункте. И теперь становится ясно, что этот запрос исключает любых сотрудников, не находящихся в местоположении 1700 - это не всегда верно для другого запроса.

Кроме того, это один не имеет функцию NVL применительно к commission_pct, что означает, что сотрудники будут исключены также, если у них есть null как commission_pct. Это связано с тем, что NULL IN (SELECT ...)всегда оценивает значение false.

Итак, есть две причины, по которым этот запрос может вернуть меньше записей, а также почему это неправильный ответ на полученное задание.

+0

спасибо, сэр, есть ли более простой способ переписать запрос с использованием моего метода? Возможно использование JOIN? И я не совсем понимаю, что «Вы не изменили бы ничего существенного, если бы вы переместили это условие на location_id во внешнем, где предложение». mean ... –

+0

Извините, я думал, что ваш вопрос был * «В чем разница между двумя SQL и почему у них нет тот же результат? »*. Теперь вы просите переписать запрос? Если это ваш вопрос, напишите новый вопрос (без проблем). Мой комментарий к условию« location_id »означает, что это условие не имеет отношения ни к чему в подзапрос , и поэтому довольно вводит в заблуждение. Это условие для внешнего запроса, поэтому его следует поместить туда. И я говорю, что такой шаг не изменит результат. Но он лучше разъясняет, что происходит. – trincot