оставил соединение на MS SQL 2008 R2 - PullRequest
1 голос
/ 03 февраля 2012

Я пытаюсь присоединиться к двум столам.Таблица A содержит 100 уникальных записей с field_a_1, field_a_2, field_a_3.Сочетание field_a_1 и field_a_2 является уникальным.

Таблица B содержит миллионы записей с несколькими полями.field_b_1 совпадает с field_a_1, а field_b_2 совпадает с field_a_2.

Я соединяю две таблицы вместе, вот так:

select a.*, b.* 
from a 
left join b 
 on field_a_1 = field_b_1 
and field_a_2 = field_b_2

Вместо 100 записей я получаю многомиллионные записи.Почему это?

Ответы [ 3 ]

4 голосов
/ 03 февраля 2012

Поскольку таблица B имеет несколько строк для каждой записи таблицы A.

Например:

TableA (ID)
1
2
3    

TableB (ID, data)
1 hello
1 world
1 foo
1 bar
2 data
2 words
2 more 
3 words
3 boring

Если вы left join из TableA в TableB, вы получите строку для каждой записи TableB, которая соответствует записи TableA - т.е. все они.

Можете ли вы объяснить, какие результаты вы ищете?

3 голосов
/ 03 февраля 2012

Поскольку левое соединение возвращает все строки из первой таблицы + все совпадающие строки из второй таблицы.Какой из миллионов подходящих строк вы ожидали получить?

0 голосов
/ 03 февраля 2012

Левое соединение или внутреннее соединение на самом деле не имеют значения. JOIN вернет все строки, которые соответствуют условию соединения. Таким образом, если в таблице b миллионы строк, соответствующих критериям JOIN, будут возвращены все строки.

В зависимости от того, чего вы хотите достичь, вы должны использовать ключевое слово DISTINCT или GROUP BY для выполнения агрегатных функций.

...