SQL ссылка 5 таблиц - PullRequest
       7

SQL ссылка 5 таблиц

0 голосов
/ 29 июля 2011

Намного больше, но есть 3 таблицы ...

employees  
employee_id  

licenses  
license_id  
employee_id  


companies  
company_id  
employee_id  

SELECT  * FROM employees  
LEFT JOIN licenses  
ON employees.employee_id = licenses.employee_id   
LEFT JOIN companies  
ON employees.employee_id = companies.employee_id  
GROUP BY employees.employee_id  

Я могу получить его только так, что либо лицензии, либо компании возвращают значение, а остальные возвращают NULL.Как я могу получить так, чтобы ОБА таблицы возвращали значения?Кажется, это так просто, но в данном случае это не работает, и я не могу понять, почему ...

РЕДАКТИРОВАТЬ: Вот еще немного информации.
Не каждый сотрудник имеет лицензию.
Не у каждого сотрудника есть компания.

Хотел бы вернуть employee_id license_id (if exists, else NULL) company_id (if exists, else NULL)

Возьмите случай, когда у сотрудника есть как license_id, так и company_id.Удалив одно из предложений JOIN, можно вернуть соответствующее значение.Однако, когда оба объединены, только возвращение company_id и license_id возвращает NULL.

Странно, верно?Любые идеи или нужна дополнительная информация?

ДАННЫЕ:
employee_id
1
2
3

employee_id license_id 1 1
2 1
3 2

employee_id company_id 1 1
2 1
3 2

ПОЖАЛУЙСТА, ВРЕМЯ ПОТЕРЯТЬ

Схема таблицы запутана и избыточна.Это была унаследованная схема, и я просто рассматривал SQL, а не базовую структуру.База данных нуждается в реструктуризации.

Ответы [ 3 ]

1 голос
/ 29 июля 2011

Это очень сложно ответить, не видя данных в таблицах. Поэтому я сделаю предположение, что в каждой таблице есть строки, которые имеют один и тот же идентификатор Employee_ID, поэтому объединения работают. Пока вы тестируете это, я бы посоветовал выбрать один Employee_id для работы, просто чтобы упростить вывод во время тестирования.

Исходя из моих предположений, я переключил ваши запросы на внутренние объединения, это будет показывать только те строки, которые соответствуют Employee_id. Я также использовал «псевдонимы». Одна буква, которую я ставлю после каждого указателя таблицы, экономит много времени на ввод текста.

SELECT *
FROM  employees e
INNER JOIN licenses l
    ON e.employee_id = l.employee_id
INNER JOIN companies 
    ON e.employee_id = c.employee_id
GROUP BY   employee_id

Если вы новичок в SQL-соединениях, эта статья также может оказаться полезной. Желаем удачи!

0 голосов
/ 29 июля 2011

Существует множество различных типов JOIN.Мое предложение было бы прочитать о них, чтобы понять это.Вы можете использовать FULL OUTER JOIN

SELECT  * 
FROM employees  
FULL OUTER JOIN licenses  
    ON employees.employee_id = licenses.employee_id   
FULL OUTER JOIN companies  
    ON employees.employee_id = companies.employee_id  
GROUP BY employee_id  

. Трудно точно определить, что вы хотите, не видя никаких данных.Но вот удобное визуальное объяснение соединений SQL.Я держу это в закладках для тех времен, когда мне нужна помощь.

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

0 голосов
/ 29 июля 2011

Это моя любимая статья на эту тему.

http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx

Попробуйте

FULL OUTER JOIN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...