Как мы помним из предыдущих лекций, декартово
произведение двух отношений-операндов составляется как набор всех
возможных пар именованных значений кортежей на атрибутах. Поэтому на
языке структурированных запросов операция декартова произведения
реализовывается при помощи перекрестного соединения, обозначаемого
ключевым словом cross join, что буквально и переводится «перекрестное объединение» или «перекрестное соединение».
Оператор Select в конструкции, представляющей операцию
декартова произведения на языке структурированных запросов, присутствует
только один и имеет следующий вид:
Select *
From R1 cross join R2
Здесь R1 и R2 – имена исходных отношений-операндов. Опция cross join
обеспечивает, что в результирующее отношение запишутся все атрибуты
(все, потому что в первой строчке оператора поставлен значок «*»),
соответствующие всем парам кортежей отношений R1 и R2.
Очень важно помнить одну особенность воплощения в жизнь
операции декартова произведения. Эта особенность является следствием
определения бинарной операции декартова произведения. Напомним его:
r4(S4) = r1(S1) × r2(S2) = {t(S1 ∪ S2) | t[S1] ∈ r1 & t(S2) ∈ r2}, S1 ∩ S2= ∅;
Как видно из приведенного определения, пары
кортежей образуются при обязательно непересекающихся схемах отношений.
Поэтому и при работе на языке структурированных запросов SQL непременно
оговаривается, что исходные отношения-операнды не должны иметь
совпадающих имен атрибутов. Но если эти отношения все же имеют
одинаковые имена, сложившуюся ситуацию можно легко разрешить с помощью
операции переименования атрибутов, т. е. в подобных случаях необходимо
просто использовать опцию as, о которой упоминалось ранее.
Рассмотрим пример, в котором нужно найти декартово
произведение двух отношений, имеющих некоторые имена своих атрибутов
совпадающими. Итак, пусть даны следующие отношения: Мы видим, что атрибуты R1.B и R2.B
имеют одинаковые имена. С учетом этого оператор Select, реализующий на
языке структурированных запросов эту операцию декартова произведения,
будет выглядеть следующим образом:
Select А, R1.B as B1, R2.B as B2, C
From R1 cross join R2;
Таким образом, с использованием опции
переименования as, у машины не возникнет «вопросов», по поводу
совпадающих имен двух исходных отношений-операндов.
|