2013-03-12 4 views
0

У меня есть целая куча таблиц:Multiple слева присоединяется к одной таблице

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

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

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

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

... 

Table1 является особенным, как это на самом деле содержат все лиц (имена и личные данные), но все остальные таблицы почти наверняка отсутствующие строки (человек просто не участвовал в этом событии).

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

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 

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

Заранее благодарен!

ответ

1

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

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 

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

+0

Такая простая вещь .... Спасибо за быстрый ответ! Ну, теперь почти отлично работает, проблема в том, что я не получаю столько же строк на выходе, как я и ожидал. В таблице 1 содержится около 1000 строк, поэтому, поскольку все остается присоединенным к нему, результат тоже должен иметь 1000 строк, но я получаю около 900 строк. Очень возможно, что существует ~ 100 люди, которые ничего не участвовали, но я подумал бы тогда, что каждое поле будет просто NULL. Не так ли? – mstobb

+0

Можете ли вы привести пример строки, которая опускается. –

+0

Я думаю, что эта новая проблема связана с программным обеспечением. Libre Base менее совершенна во многих отношениях. Когда я подсчитываю количество строк непосредственно с новым запросом, я получаю правильный номер. Очень странно. Спасибо за помощь! – mstobb

2

Используйте это:

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 Joins виде дополнительной информации.

+0

+1: Ты меня зацепила за провод. ;-( –

+0

Вы, ребята, сумасшедшие быстро. Спасибо за помощь! – mstobb