Несколько левых соединений к одному столу

У меня есть целая куча таблиц:

Table1: PersonID, A1, A2, A3, ...

Table2: PersonID, B1, B2, B3, ...

Table3: PersonID, C1, C2, C3, ...

Table4: PersonID, D1, D2, D3, ...

...

Таблица1 является особенной, поскольку на самом деле она содержит всех лиц (имена и личную информацию), но во всех других таблицах почти наверняка отсутствуют строки (человек просто не участвовал в этом событии).

То, что я хотел бы сделать, это объединить все таблицы вместе (по общему PersonID) так, чтобы любые отсутствующие атрибуты просто оставались пустыми. Поэтому, конечно, я подумал использовать внешние соединения. Вот что я попробовал:

SELECT * 

FROM Table1, Table2, Table3, Table4, Table5, Table6

LEFT OUTER JOIN Table2 ON Table1.PersonID = Table2.PersonID
LEFT OUTER JOIN Table3 ON Table1.PersonID = Table3.PersonID
LEFT OUTER JOIN Table4 ON Table1.PersonID = Table4.PersonID
LEFT OUTER JOIN Table5 ON Table1.PersonID = Table5.PersonID
LEFT OUTER JOIN Table6 ON Table1.PersonID = Table6.PersonID

Все это дает мне перегрузку памяти. Я думаю, что я каким-то образом беру на себя декартово произведение всех моих столов, и оно все душит. Есть ли хороший способ сделать это?

Заранее спасибо!

2 ответа

Решение

Изменить это:

SELECT * 

FROM Table1, Table2, Table3, Table4, Table5, Table6

LEFT OUTER JOIN Table2 ON Table1.PersonID = Table2.PersonID
LEFT OUTER JOIN Table3 ON Table1.PersonID = Table3.PersonID
LEFT OUTER JOIN Table4 ON Table1.PersonID = Table4.PersonID
LEFT OUTER JOIN Table5 ON Table1.PersonID = Table5.PersonID
LEFT OUTER JOIN Table6 ON Table1.PersonID = Table6.PersonID

к этому:

SELECT * 

FROM Table1
LEFT OUTER JOIN Table2 ON Table1.PersonID = Table2.PersonID
LEFT OUTER JOIN Table3 ON Table1.PersonID = Table3.PersonID
LEFT OUTER JOIN Table4 ON Table1.PersonID = Table4.PersonID
LEFT OUTER JOIN Table5 ON Table1.PersonID = Table5.PersonID
LEFT OUTER JOIN Table6 ON Table1.PersonID = Table6.PersonID

Да, вы брали декартово произведение всех столов, а затем оставляли, присоединяя его к остальным

Использовать этот:

SELECT * 
FROM Table1
LEFT OUTER JOIN Table2 ON Table1.PersonID = Table2.PersonID
LEFT OUTER JOIN Table3 ON Table1.PersonID = Table3.PersonID
LEFT OUTER JOIN Table4 ON Table1.PersonID = Table4.PersonID
LEFT OUTER JOIN Table5 ON Table1.PersonID = Table5.PersonID
LEFT OUTER JOIN Table6 ON Table1.PersonID = Table6.PersonID

Посмотрите на форму SQL-соединений больше информации.

Другие вопросы по тегам