2013-04-08 2 views
1

Я хотел бы знать, что логика для многократного объединения (например, ниже)Использование нескольких объединений (например, влево присоединиться)

SELECT * FROM B возвращает 100 строк

SELECT B.* FROM B LEFT JOIN C ON B.ID = C.ID возвращает 120 строк

Как я знаю используя левое соединение, вернет любые соответствующие данные из левой таблицы, которая является B, если данные найдены для обеих таблиц. Но как при использовании left join оно возвращает больше данных, чем сама таблица B?

Что я делаю неправильно или неправильно понял здесь? Любое руководство очень ценится. Заранее спасибо.

ответ

1

Позволять таблице B:

id 
---- 
1 
2 
3 

Позволять таблица C

id  name 
------------ 
1  John 
2  Mary 
2  Anne 
3  Stef 

Любой идентификатор из b сопоставляется с идентификаторами c, тогда id = 2 будет согласован дважды. Таким образом, левое соединение на id вернет 4 строки, даже если базовая таблица B имеет 3 строки.

Теперь рассмотрим более злым Например:

Таблица B

id 
---- 
1 
2 
2 
3 
4 

таблицу С

id  name 
------------ 
1  John 
2  Mary 
2  Anne 
3  Stef 

Каждый идентификатор из б сочетается с идентификаторами из С, то сначала ID = 2 будет совпадать дважды, а второй id = 2 будет согласован дважды, чтобы результат

select b.id, c.name 
from b left join c on (b.id = c.id) 

будет

id  name 
------------ 
1  John 
2  Mary 
2  Mary 
2  Anne 
2  Anne 
3  Stef 
4  (null) 

Ид = 4 не соответствует, но появляется в результате, потому что это левое соединение.

+0

Могу ли я узнать, как вы отформатируете результат запроса? Спасибо –

+0

Вы говорите о форматировании текста в переполнении стека? У вас есть кнопка, когда вы находитесь в режиме редактирования. Его эффект заключается в том, чтобы выделить строки с 4 или 5 пробелами, а результат - форматирование _code style_. –

+0

Привет, поэтому я использую DISTINCT для устранения дублированных данных, полученных из C, тогда мой вывод запроса будет данными только с B справа? –

1

Посмотрите на следующий пример:

B = {1,2} 
C = {(1,a),(1,b),(1,c),(1,d),(1,e)} 

Результат B left join C будет:

1 | a 
1 | b 
1 | c 
1 | d 
1 | e 
2 | null 

Число строк в результате определенно больше, чем строк в B (2).

В общем случае число строк в результате B left join C ограничена B.size + C.size и не только B.size как вы думаете ...

0

По вашему запросу он делает соединение с B Таблица с таблицей C и B является левой таблицей, поэтому она отображает все записи левой таблицы в нашем случае, это B и относится к другой таблице в нашем случае это C

Смежные вопросы