Почему результаты естественного и внутреннего соединения отличаются в моем запросе в SqlDeveloper?

Я выполнил приведенные ниже запросы, чтобы отобразить фамилию, должность, номер отдела и название отдела для всех сотрудников, которые работают в Торонто.

Структура таблицы такая

  • Сотрудники (идентификатор сотрудника, фамилия, идентификатор отдела, ...)
  • Подразделения (идентификатор_отдела, имя_отдела, идентификатор_обслуживания ...)
  • Адреса (location_id, город, ...)

С предложениями ON и USING он возвращает два результата: row и

С предложением NATURAL JOIN он возвращает только одно.

В чем разница, я запрашиваю его с неправильным естественным соединением?

С включенным

SELECT 
  e.last_name,
  e.job_id,
  d.department_name, 
  l.city
FROM employees e 
  JOIN departments d ON e.department_id= d.department_id
  JOIN locations l ON d.location_id=l.location_id
WHERE upper(l.city)='TORONTO'; 

С ИСПОЛЬЗОВАНИЕМ

SELECT 
  e.last_name,
  e.job_id,
  d.department_name, 
  l.city
FROM employees e 
  JOIN departments d USING(department_id)
  JOIN locations l USING(location_id)
WHERE upper(l.city)='TORONTO';

С ЕСТЕСТВЕННЫМ СОЕДИНЕНИЕМ

SELECT 
  last_name,
  job_id, 
  department_name, 
  city
FROM employees 
  NATURAL JOIN departments
  NATURAL JOIN locations
WHERE upper(city)='TORONTO';

person user2333808    schedule 17.05.2015    source источник
comment
NATURAL JOIN опасен, потому что он просто объединяет все совпадающие имена столбцов, проверьте определения ваших таблиц, если в обеих таблицах существуют дополнительные повторяющиеся имена столбцов   -  person dnoeth    schedule 17.05.2015
comment
Ответ лежит на ... в определениях ваших таблиц выше, но тот факт, что вы получаете меньше записей с NATURAL JOIN, указывает на то, что действительно существует другое общее поле между таблицами, которое вы не используете в своих явных объединениях.   -  person Hart CO    schedule 17.05.2015
comment
Вы не говорите, каково правило, по которому строка должна быть в вашем результате, так как мы можем сказать вам, какие выражения запроса подходят? Ваши запросы не имеют того же значения. Если кто-то не вернет то, что вы ожидаете, расскажите нам, чего вы ожидаете и почему - обратитесь к руководству - мы можем сказать, где вы пошли не так. В противном случае вы просто просите нас переписать руководство. Также: минимальный воспроизводимый пример   -  person philipxy    schedule 08.11.2018


Ответы (1)


Я предполагаю, что вы используете схему HR в Oracle. и у сотрудников, и у отдела есть поле mangager_id, к которому вы не присоединяетесь. но естественное соединение присоединится к ним.

person Bryan Dellinger    schedule 18.05.2015
comment
Спасибо за Ваш ответ. Итак, я не могу использовать естественное соединение, чтобы получить правильный результат, верно? - person user2333808; 19.05.2015
comment
естественное соединение ведет себя так? ищет общие столбцы и обнаруживает 2 столбца, он оценивает как комбинированный уникальный ключ, затем проверяет соответствующие результаты в другой таблице. если это так, он проверяет manager_id из таблицы отделов, а не сотрудников из-за неиспользованного квалификатора (псевдоним таблицы), в моем случае я думаю ... я запросил d.manager_id с предложением ON, результат: (manager_id Department_id) (201 20) , (201 20) для e.manager_id с предложением ON результат будет: (manager_id Department_id) (100 20), (201 20) - person user2333808; 19.05.2015
comment
В результате я не должен использовать естественное соединение, если у меня более 1 общего столбца, верно? - person user2333808; 19.05.2015
comment
он присоединится к столбцам с одинаковыми именами. Я обычно избегаю естественного соединения, потому что при добавлении новых столбцов в таблицы запросы могут перестать работать - person Bryan Dellinger; 19.05.2015
comment
Спасибо за помощь. Приятного кодирования - person user2333808; 19.05.2015
comment
На самом деле я скучаю, что Oracle взяла новую работу для интерфейса .net к приложению cobol для мэйнфрейма, а база данных - это DB2 Yeck - person Bryan Dellinger; 19.05.2015