2013-06-06 2 views
1

Я хочу выбрать некоторые значения из трех таблиц, эти таблицы связаны с внешними ключами.Объединить таблицы с нулевыми значениями в FK

Таблица, содержащая внешний ключ, может иметь нулевое значение в этом FK.

Когда я выбираю из трех таблиц, я не получаю строки, где FK имеет значение NULL.

для Exemple это мои таблицы:

ТАБЛИЦА 1 (boninterne):

+---------+-----------+----------+----------+ 
| num | date | codePers | codeDept | 
+---------+-----------+----------+----------+ 
|1  |12/10/2012 + NULL | 2  | 
+---------+-----------+----------+----------+ 
|2  |12/10/2012 | NULL | NULL | 
+---------+-----------+----------+----------+ 
|3  |12/10/2012 | 1  | 2  | 
+---------+-----------+----------+----------+ 
|4  |12/10/2012 | 4  | NULL | 
+---------+-----------+----------+----------+ 
|5  |12/10/2012 | 12  | 2  | 
+---------+-----------+----------+----------+ 
|6  |12/10/2012 | 3  | NULL | 
+---------+-----------+----------+----------+ 
|7  |12/10/2012 | 1  | 2  | 
+---------+-----------+----------+----------+ 
|8  |12/10/2012 | NULL | 3  | 
+---------+-----------+----------+----------+ 

ТАБЛИЦА 2 (персонал):

+---------+-----------+----------+ 
|codePers |prenomPers | nomPers | 
+---------+-----------+----------+ 
|1  |AA   + ZZ  | 
+---------+-----------+----------+ 
|4  |BB   | WW  | 
+---------+-----------+----------+ 
|3  |CC   | XX  | 
+---------+-----------+----------+ 
|12  |DD   | VV  | 
+---------+-----------+----------+ 

ТАБЛИЦА 3 (Departement):

+---------+-----------+ 
|codeDept |libDept | 
+---------+-----------+ 
|2  |DEPT A1 + 
+---------+-----------+ 
|3  |DEPT B1 | 
+---------+-----------+ 

и это запрос я сделал:

SELECT num, date, CONCAT(prenomPers,' ',nomPers) AS nom, libDept 
FROM boninterne, personnel, departement 
WHERE boninterne.codePers = personnel.codePers 
AND boninterne.codeDept = departement.codeDept 

таблица Я хочу, чтобы это:

+---------+-----------+----------+----------+ 
| num | date | nom  | libDept | 
+---------+-----------+----------+----------+ 
|1  |12/10/2012 + NULL | DEPT A1 | 
+---------+-----------+----------+----------+ 
|2  |12/10/2012 | NULL | NULL | 
+---------+-----------+----------+----------+ 
|3  |12/10/2012 | AA ZZ | DEPT A1 | 
+---------+-----------+----------+----------+ 
|4  |12/10/2012 | BB WW | NULL | 
+---------+-----------+----------+----------+ 
|5  |12/10/2012 | DD VV | DEPT A1 | 
+---------+-----------+----------+----------+ 
|6  |12/10/2012 | CC XX | NULL | 
+---------+-----------+----------+----------+ 
|7  |12/10/2012 | AA ZZ | DEPT A1 | 
+---------+-----------+----------+----------+ 
|8  |12/10/2012 | NULL | DEPT B1 | 
+---------+-----------+----------+----------+ 

Но то, что я действительно получаю:

+---------+-----------+----------+----------+ 
| num | date | nom  | libDept | 
+---------+-----------+----------+----------+ 
|3  |12/10/2012 | AA ZZ | DEPT A1 | 
+---------+-----------+----------+----------+ 
|5  |12/10/2012 | DD VV | DEPT A1 | 
+---------+-----------+----------+----------+ 
|7  |12/10/2012 | AA ZZ | DEPT A1 | 
+---------+-----------+----------+----------+ 

Что мне нужно изменить в моем запросе, чтобы получить эту таблицу?

+1

Пожалуйста, используйте ANSI 1992. После этого вам станет понятнее. – Sebas

+0

@Sebas Что вы подразумеваете под ANSI 1992? –

+0

см. Http://www.andrew.cmu.edu/user/shadow/sql/sql1992.txt, ищите выражения запроса 179 (вперед) – Sebas

ответ

3

Результаты поиска верны, потому что вы используете внутренние соединения. Вы можете исправить это с помощью надлежащего присоединиться синтаксис и использование left outer join вместо:

SELECT num, date, CONCAT(prenomPers,' ',nomPers) AS nom, libDept 
FROM boninterne 
left outer join personnel 
    on boninterne.codePers = personnel.codePers 
left outer join departement 
    on boninterne.codeDept = departement.codeDept; 

Это будет держать все в первой таблице, даже когда нет матча.

Смежные вопросы