Перекрестное объединение
Перекрестное объединение (или Декартово произведение’) двух таблиц можно определить как еще одну таблицу, содержащую все возможные пары строк таблиц-источников. Пример, приведенный в разделе, посвященном объединениям неравенства, является аналогом перекрестного объединения таблиц CUSTOMER и PHONE и возвращает результаты, аналогичные показанным на рис. 9.2, за исключением того, что соответствующие клиентам номера телефонов будут также получены. Следующий запрос возвращает все возможные комбинации наименований клиентов и их номеров телефонов с помощью формирования перекрестного объединения таблиц CUSTOMER и PHONE. Старый синтаксис перекрестного объединения позволяет опустить в инструкции SELECT предложение Перекрестное объединение может оказаться достаточно дорогостоящей операцией, особенно когда является результатом ошибки программиста и включает в себя множество больших таблиц с сотнями тысяч и даже миллионами строк. Так как результатом декартова произведения являются все возможные комбинации строк первой и второй таблицы, если в одной из них содержится 100 тыс. строк, а во второй — 200 тыс., запрос вернет 20 млрд. строк. Этого вполне достаточно, чтобы перегрузить даже очень мощный сервер баз данных и замедлить работу клиентов. Таким образом, к декартову произведению следует подходить с осторожностью, тем более что его в инструкциях SQL используют нечасто. Перекрестные объединения удобно использовать для наполнения таблиц тестовыми данными или в учебных целях (к примеру, для демонстрации того факта, что объединения равенства и неравенства являются частным случаем перекрестных объединений), однако на практике бессмысленные комбинации фактов (к примеру, номеров телефонов одних компаний и названий других) вряд ли пригодятся. Как правило, на практике декартовы произведения являются результатом ошибки программиста и должны исправляться администратором базы данных (к примеру, с помощью отключения сеанса работы пользователя, как было описано в главе 7).