SQL Join Query множественные Один-ко-многим? или многие ко многим? - PullRequest
3 голосов
/ 24 января 2012

Надеюсь, это будет простой вопрос!

У меня есть две таблицы: таблица «client (s)» и отдельная таблица «names». Основой является то, что клиент может иметь одно или два (макс.) Имени. Я структурировал их так, чтобы у каждого «имени» мог быть свой заголовок. Таблицы:

clients
+------------+-------------+------------+
| clientID   | nameID1     | nameID2    |
+------------+-------------+------------+
|          1 | 1           | 2          |
|          2 | 3           |            |
|          3 | 4           |            |
+------------+-------------+------------+


names 
+------------+-------------+------------+------------+
| nameID     | surname     | initials   | titleID    |
+------------+-------------+------------+------------+
|          1 | Banks       | P          | 1          |
|          2 | Smith       | W          | 2          |
|          3 | Wilson      | BT         | 2          |
|          4 | Jefferson   | JP         | 3          |
+------------+-------------+------------+------------+

Где titleID извлекается из ...

titles 
    +------------+-------------+
    | titleID    | titleName   |
    +------------+-------------+
    |          1 | Mr          |
    |          2 | Mrs         |
    |          3 | Miss        |
    +------------+-------------+

Так, например, clientID = 1 - это мистер P Banks '&' Mrs W Smith

Проблема в том, что я не знаком с запросами, чтобы получить ответ выше.

Я не могу попробовать:

SELECT
clientID, names.surname, names.initials, titleName
FROM clients, names, titles
WHERE titleID = titleID AND
NameID1 = nameID AND
NameID2 = nameID

Как правильно объединить таблицы в запросе, например, чтобы найти clientID 1 = Mr P Banks '&' Mrs W Smith

1 Ответ

2 голосов
/ 24 января 2012

Вам необходимо присоединиться к таблице имен (и названий) дважды, один раз для nameID1 и один раз для nameID2. Я предположил, что у клиента должно быть хотя бы одно имя, следовательно nameID1 равно INNER JOIN, а так как namedID2 является необязательным (допускает значение NULL), оно равно LEFT OUTER JOIN.

SELECT c.clientID, n1.surname, n1.initials, t1.titleName, n2.surname, n2.initials, t2.titleName
FROM clients c
INNER JOIN names n1 ON nameID1 = n1.nameID
INNER JOIN titles t1 ON n1.titleID = t1.titleID
LEFT OUTER JOIN names n2 ON nameID2 = n2.nameID
INNER JOIN titles t2 ON n2.titleID = t2.titleID
...