2015-01-23 2 views
0

У меня возникает вопрос в SQL-соединениях. У меня есть сотрудник таблицы с employeeid как первичный ключ и некоторые другие столбцы для сотрудника. И есть другая таблица, называемая employeeaddress, где может быть несколько employeeid - это внешний ключ. У одного сотрудника может быть много сотрудников, только для того, чтобы объяснить отношения друг к другу.SQL Присоединиться к левому соединению или к левому внешнему соединению

Если я хочу написать запрос, который будет получать следующие столбцы

employee.employeeid, employee.empname, 
employeeaddress.employeeaddressid, employeeaddress.addr1, 
employeeaddress.addr2 

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

Нужно ли применять left join или left outer join? Я хочу следующий результат для таблицы, которая имеет 2 сотрудников John и Michael, где John имеет два employeeaddresses с employeeaddressid 21 и 22 и Michael не имеет employeeaddress

1, John, 21, addr1 for John, addr2 for John 
1, John, 22, another addr1 for John, another addr2 for John 
2, Michael, NULL , NULL , NULL 

Полученный результат устроен следующим образом

employee.employeeid, employee.empname, employeeaddress.employeeaddressid, employeeaddress.addr1, employeeaddress.addr2 

Пожалуйста, помогите.

+5

LEFT JOIN такое же, как LEFT OUTER JOIN. Как выглядит ваш текущий запрос? – jarlh

+0

Я использовал объединение LEFT только для моего запроса, но поскольку я извлекаю несколько столбцов, я все еще проверяю, повторяется ли первичный ключ в первой таблице для нескольких записей во второй таблице. Поэтому я объяснил свой запрос с помощью простого сценария – SARAVAN

+0

LEFT OUTER JOIN, но ... address1 и address2 - это два разных столбца одной и той же строки в таблице emplyeeaddress? Или вам нужны две разные строки? –

ответ

0

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

Кроме того, поскольку комментарии не увенчались успехом, LEFT JOIN является сокращением для LEFT OUTER JOIN, они будут давать одинаковые результаты.

SELECT * 
FROM employee 
inner join 
(
    SELECT 
     employeeid, 
     count(*) as addresscount 
    FROM employee 
    left join employeeaddress ON employeeaddress.employeeaddressid = employee.employeeaddressid 
    group by employeeid 
) counts on counts.employeeid = employee.employeeid 
WHERE counts.addresscount = 0 -- Or 1, or 5 or > 1, etc. 
0

LEFT JOIN должно быть все, что вам нужно.

SQL Fiddle Example

SELECT e.employeeID , 
     e.empName , 
     ea.employeeAddressID , 
     ea.addr1 , 
     ea.addr2 
FROM Employee e 
     LEFT JOIN EmployeeAddress ea ON ea.employeeID = e.employeeID