double arrow

Многотабличные объединения в стандарте SQL2

Одно из крупных преимуществ расширенного предложения From заключается в том, что оно дает единый стандарт для определения как внутренних и внешних объединений, так и произведений и запросов на объединение. Другим, даже еще более важным преимуществом этого предложения является то, что оно обеспечивает очень ясную и четкую спецификацию объединений трех и четырех таблиц, а также произведений и запросов на объединение. Для построения этих сложных объединений любые выражения объединения могут быть заключены в круглые скобки. Результирующее выражение, в свою очередь, можно использовать для создания других выражений объединения, как если бы оно было простой таблицей. Точно так же, как SQL позволяет с помощью круглых скобок комбинировать различные арифметические операции (+, -, * и /) и строить сложные выражения, стандарт SQL2 дает возможность создавать сложные выражения для объединений.

Чтобы привести пример многотабличного объединения, предположим, что к таблицам girls и boys добавлена новая таблица parents, которая имеет три столбца:

child Соответствует столбцу name в таблицах girls и boys type Принимает значение " father "(отец) или " mother "(мать) pname Имя родителя

Строка в таблице girls или boys может иметь две связанные строки в таблице parent, одна из которых определяет мать, а другая — отца, или может иметь только одну из этих строк, или может совсем не иметь связанных строк, если отсутствуют данные о родителях ребенка. В таблицах girls, boys и parents в совокупности содержится достаточно богатый набор данных, чтобы обеспечить несколько примеров многотабличных запросов.

Предположим, например, что вы хотите составить список всех детей и их родителей. Вот запрос, создающий такой список:

Так как это внутреннее объединение, то девочки и мальчики, не имеющие связанных строк в таблице parents, в таблицу результатов запроса не попадут. Модифицируя этот запрос в левое внешнее объединение, можно включить соответствующие этим детям строки (с расширением null) в результаты запроса:

Если по каким-либо причинам вы хотите включить в результаты запроса только несвязанные строки девочек, то для этого можно переделать данный запрос в запрос на объединение двух объединений, одного внутреннего и одного внешнего:

В качестве еще одного примера предположим, что вы опять, как в предыдущих примерах, хотите найти пары мальчик/девочка из одного и того же города, но на этот раз вы хотите еще и включить в таблицу результатов имя отца мальчика и имя матери девочки. То, что в объединениях данного примера могут присутствовать несвязанные строки, означает несколько возможных "правильных" ответов на запрос. Например, предположим, что вы хотите включить в результаты запроса все пары мальчик/девочка из одних и тех городов, даже те, в которых либо мальчик, либо девочка имеют строки, не связанные с таблицей parents. В этом запросе вам придется использовать два внешних объединения — (boys join parents) и (girls join parents) — и одно внутреннее: (boys join girls). В результате этот запрос в стандарте SQL2 будет выглядеть следующим образом:

Как видно из примера, даже запрос с тремя объединениями в соответствии со стандартом SQL2 может иметь весьма сложный вид. Однако, несмотря на эту сложность, запрос по стандарту SQL2 точно и однозначно определяет то, что должна выполнить СУБД. Нет никакой неясности в отношении порядка объединения таблиц или в отношении того, какие объединения являются внешними, а какие — внутренними. Возможность произвольного сочетания операций union и join обеспечивает гибкость предложения from. В общем, новые возможности стоят дополнительных сложностей расширенного предложения from стандарта SQL2.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: