Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Естественные соединения

Gt; SUM(avail_balance) tot_deposits _> FROM account | Подзапросы в условиях фильтрации | Подзапросы как генераторы выражений | Gt; SUM(a.avail_balance) tot_deposits _> FROM account a | Краткий обзор подзапросов | Упражнения | Внешние соединения | Сравнение левосторонних и правосторонних внешних соединений | Трехсторонние внешние соединения | Рекурсивные внешние соединения |


Читайте также:
  1. ANSI_синтаксис соединения
  2. А) определение группы соединения обмоток;
  3. Бор и его соединения. Нахождение в породах, в вулканических и поствулканических процессах. Источники бора в осадочных породах.
  4. В основе процесов получения уретановых эластомеров лежит реакция поликонденсации диизоцианатов с соединениями, имеющими по крайней мере две гидроксильные группы.
  5. Внешние соединения
  6. Внутренние соединения
  7. Геохимия As. Гидротермальный процесс и соединения As.

 

Если вы ленивы (а кто не ленив?), можно выбрать тип соединения, при котором сервер БД сам определяет необходимые условия соединения указанных вами таблиц. Известный как естественное соединение (na_ tural join), этот тип соединения делает предположение о необходимыхусловиях соединения, полагаясь на идентичные имена столбцов в таб_ лицах. Например, таблица account включает столбец cust_id, являю_ щийся внешним ключом к таблице customer, первичный ключ которой также имеет имя cust_id. Таким образом, можно написать запрос, ис_ пользующий для соединения этих двух таблиц natural join:

 

mysql> SELECT a.account_id, a.cust_id, c.cust_type_cd, c.fed_id

_> FROM account a NATURAL JOIN customer c;

 

+____________+_________+______________+_____________+ | account_id | cust_id | cust_type_cd | fed_id | +____________+_________+______________+_____________+

|   |   | I | 111_11_1111 |
|   |   | I | 111_11_1111 |
|   |   | I | 111_11_1111 |
|   |   | I | 222_22_2222 |
|   |   | I | 222_22_2222 |
|   |   | I | 333_33_3333 |
|   |   | I | 333_33_3333 |
|   |   | I | 444_44_4444 |
|   |   | I | 444_44_4444 |
|   |   | I | 444_44_4444 |
|   |   | I | 555_55_5555 |
|   |   | I | 666_66_6666 |
|   |   | I | 666_66_6666 |

 

Естественные соединения        
           
|   |   | I | 777_77_7777 |
|   |   | I | 888_88_8888 |
|   |   | I | 888_88_8888 |
|   |   | I | 999_99_9999 |
|   |   | I | 999_99_9999 |
|   |   | I | 999_99_9999 |
|   |   | B | 04_1111111 |
|   |   | B | 04_1111111 |
|   |   | B | 04_2222222 |
|   |   | B | 04_3333333 |
|   |   | B | 04_4444444 |

 

+____________+_________+______________+_____________+ 24 rows in set (0.02 sec)

 

Поскольку задано естественное соединение, сервер проверил описания таблиц и добавил для этих двух таблиц условие соединения a.cust_id = c.cust_id.

 

Все это хорошо и замечательно, но что будет, если имена столбцов в таблицах не совпадают? Например, в таблице account также есть внешний ключ к таблице branch, но этот столбец в таблице account на_ зван open_branch_id, а не branch_id. Посмотрим, что произойдет, если попытаться провести natural join между таблицами account и branch:

 

mysql> SELECT a.account_id, a.cust_id, a.open_branch_id,

_> FROM account a NATURAL JOIN branch b;

 

+____________+_________+________________+_______________+ | account_id | cust_id | open_branch_id | name | +____________+_________+________________+_______________+

 

|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |
|   |   |   | Headquarters |

 

            Глава 10. И снова соединения
             
|   |   |   | Headquarters |
...            
...            
...            
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |
|   |   |   | So. NH Branch |

 

+____________+_________+________________+_______________+ 96 rows in set (0.03 sec)

 

Кажется, здесь что_то не так; запрос должен возвращать не более 24 строк, поскольку в таблице account 24 строки. Произошло следующее: поскольку сервер не смог найти два столбца с одинаковыми именами в этих двух таблицах, условие соединения сформировано не было, и для таблиц было выполнено перекрестное соединение, что в резуль_ тате дало 96 строк (24 счета умножить на 4 отделения).

 

Так что стоит ли снижение нагрузки на наши дряхлые пальцы (в виду отсутствия необходимости набирать условие соединения) возникаю_ щих при этом неприятностей? Конечно, нет. Следует избегать приме_ нения этого типа соединения и использовать внутренние соединения с явными условиями соединения.

 


Дата добавления: 2015-08-17; просмотров: 49 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Перекрестные соединения| Что такое условная логика?

mybiblioteka.su - 2015-2024 год. (0.008 сек.)