Несколько левых соединений к одному столу
У меня есть целая куча таблиц:
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-соединений больше информации.