Читайте также:
|
|
Если вы ленивы (а кто не ленив?), можно выбрать тип соединения, при котором сервер БД сам определяет необходимые условия соединения указанных вами таблиц. Известный как естественное соединение (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 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Перекрестные соединения | | | Что такое условная логика? |