it-roy-ru.com

Когда использовать левое внешнее соединение?

Я не понимаю концепцию левого внешнего соединения, правого внешнего соединения или вообще, почему нам вообще нужно использовать соединение! Вопрос, с которым я борюсь, и таблица, с которой я работаю, находится здесь: Ссылка

Вопрос 3(b) 

Создайте команду в SQL для решения следующего запроса, объяснив, почему она должна использовать метод (External) join. [5 баллов] «Найдите имя каждого сотрудника и его/ее иждивенца (если есть)»

Вопрос 3(c) - 

Создайте команду в SQL для решения следующего запроса, используя (i) метод соединения и (ii) метод подзапроса [10 баллов] «Найдите имя и фамилию каждого сотрудника, проработавшего более 20 часов в проекте« .__ ».

Может ли кто-нибудь объяснить это мне просто?

27
John Conrad

Соединения используются для объединения двух связанных таблиц.

В вашем примере вы можете объединить таблицу Employee и таблицу Department следующим образом:

SELECT FNAME, LNAME, DNAME
FROM
EMPLOYEE INNER JOIN DEPARTMENT ON EMPLOYEE.DNO=DEPARTMENT.DNUMBER

Это приведет к такой записи:

FNAME   LNAME   DNAME
-----   -----   -----
John    Smith   Research
John    Doe     Administration

Я использовал INNER JOIN выше. INNER JOINs объединяют две таблицы, так что отображаются записи only с совпадениями в обеих таблицах, и в данном случае они join, по номеру отдела (поле DNO в Employee, DNUMBER в таблице Department).

LEFT JOINs позволяют вам комбинировать две таблицы, когда у вас есть записи в первой таблице, но возможно, нет есть записи во второй таблице. Например, допустим, вы хотите получить список всех сотрудников, а также любых иждивенцев:

SELECT EMPLOYEE.FNAME as employee_first, EMPLOYEE.LNAME as employee_last, DEPENDENT.FNAME as dependent_last, DEPENDENT.LNAME as dependent_last
FROM
EMPLOYEE INNER JOIN DEPENDENT ON EMPLOYEE.SSN=DEPENDENT.ESSN

Проблема здесь в том, что если у сотрудника нет зависимого, то его запись вообще не будет отображаться - потому что в таблице DEPENDENT нет соответствующей записи.

Таким образом, вы используете соединение left, которое сохраняет все данные «слева» (т. Е. В первой таблице) и извлекает любые совпадающие данные «справа» (вторая таблица):

SELECT EMPLOYEE.FNAME as employee_first, EMPLOYEE.LNAME as employee_last, DEPENDENT.FNAME as dependent_first, DEPENDENT.LNAME as dependent_last
FROM
EMPLOYEE LEFT JOIN DEPENDENT ON EMPLOYEE.SSN=DEPENDENT.ESSN

Теперь мы получаем все из записей сотрудников. Если для данного сотрудника нет соответствующих зависимостей (ий), поля dependent_first и dependent_last будут нулевыми.

78
Jordan Reiter

пример (не используя таблицы примеров :-)

У меня есть компания по прокату автомобилей.

Table car
id: integer primary key autoincrement
licence_plate: varchar
purchase_date: date

Table customer
id: integer primary key autoincrement
name: varchar

Table rental
id: integer primary key autoincrement
car_id: integer
bike_id: integer
customer_id: integer
rental_date: date

Просто верно? У меня 10 записей на машины, потому что у меня 10 машин.
Я занимаюсь этим бизнесом уже 10 лет, поэтому у меня 1000 клиентов.
И я сдаю машины в аренду примерно 20 раз в год на машины = 10 лет х 10 машин х 20 = 2000 прокатов.

Если я сохраню все в одной большой таблице, у меня будет 10x1000x2000 = 20 миллионов записей.
Если я сохраню его в 3 таблицах, у меня будет 10 + 1000 + 2000 = 3010 записей.
Это на 3 порядка, поэтому я использую 3 таблицы. 

Но поскольку я использую 3 таблицы (для экономии места и времени), я должен использовать соединения, чтобы снова получить данные
(по крайней мере, если мне нужны имена и номерные знаки вместо номеров).

Использование внутренних объединений

Все аренды для клиента 345?

SELECT * FROM customer
INNER JOIN rental on (rental.customer_id = customer.id)
INNER JOIN car on (car.id = rental.car_id)
WHERE customer.id = 345.

Это INNER JOIN, потому что мы только хотим знать об автомобилях linked to аренда linked to клиентов, которые действительно произошли.

Обратите внимание, что у нас также есть bike_id, который связан с велосипедным столом, который очень похож на автомобильный стол, но отличается .. Как бы мы получили все велосипеды + прокат автомобилей для клиента 345.
Мы можем попробовать и сделать это

SELECT * FROM customer
INNER JOIN rental on (rental.customer_id = customer.id)
INNER JOIN car on (car.id = rental.car_id)
INNER JOIN bike on (bike.id = rental.bike_id)
WHERE customer.id = 345.

Но это даст пустой набор !!
Это потому, что аренда может быть как bike_rental OR, так и car_rental, но не одновременно.
А нерабочий запрос inner join даст результаты только для всех прокатов, когда мы сдаем в аренду как велосипед, так и автомобиль в одной транзакции.
Мы пытаемся получить и установить логические отношения OR с помощью логического соединения AND. 

Использование внешних объединений

Чтобы решить эту проблему, нам нужен outer join.

Давайте решим это с left join

SELECT * FROM customer
INNER JOIN rental on (rental.customer_id = customer.id) <<-- link always
LEFT JOIN car on (car.id = rental.car_id) <<-- link half of the time
LEFT JOIN bike on (bike.id = rental.bike_id) <<-- link (other) 0.5 of the time.
WHERE customer.id = 345.

Рассмотрим этот вариант. inner join - это AND, а left join - это OR, как в следующем псевдокоде:

if a=1 AND a=2 then {this is always false, no result}
if a=1 OR a=2 then  {this might be true or not}

Если вы создадите таблицы и выполните запрос, вы увидите результат.

по терминологии

left join - это то же самое, что left outer join. join без дополнительных префиксов - inner join Существует также full outer join. За 25 лет программирования я никогда не использовал это.

Почему левый присоединиться

Ну, есть две таблицы. В примере мы связали
клиента в аренду с inner join, во внутреннем соединении обе таблицы must link, поэтому нет разницы между таблицей left:customer и таблицей right:rental.

Следующая ссылка была left join между left:rental и right:car. С левой стороны все ряды должны быть связаны, а с правой стороны они не обязаны. Вот почему это left join

25
Johan

Вы используете внешние объединения, когда вам нужны все результаты одной из таблиц соединений, независимо от того, есть ли в другой таблице совпадающая строка или нет.

2
Oded

В общем: JOIN соединяет две таблицы вместе . Используйте INNER JOIN, когда хотите «посмотреть», как искать подробную информацию по любому конкретному столбцу . Используйте OUTER JOIN, когда вы хотите «продемонстрировать», например, перечислите всю информацию из 2 таблиц.

0
Sheng Chen

Я думаю, что Вопрос 3(b) сбивает с толку, поскольку вся его предпосылка неверна: вам не нужно использовать внешнее соединение для «решения запроса», например, Учтите это (возможно, стоит придерживаться стиля синтаксиса в экзаменационной работе):

SELECT FNAME, LNAME, DEPENDENT_NAME
  FROM EMPLOYEE, DEPENDENT
 WHERE SSN = ESSN
       AND RELATIONSHIP = 'SPOUSE'
UNION 
SELECT FNAME, LNAME, NULL
  FROM EMPLOYEE
EXCEPT 
SELECT FNAME, LNAME, DEPENDENT_NAME
  FROM EMPLOYEE, DEPENDENT
 WHERE SSN = ESSN
       AND RELATIONSHIP = 'SPOUSE'
0
onedaywhen