Sql Scholl
Распечатать страницу
Перейти на главную Карта сайта Отправить сообщение

Объединение таблиц

Важность предложения WHERE

     Может показаться странным использование предложения WHERE для установления отношения в объединении, но на это есть существенная причина. Вспомните: когда таблицы объединяются в операторе SELECT, это отношение создается "на лету".

     В определениях таблиц базы данных ничего не говорится о том, как СУБД должна объединять таблицы. Вы должны указать это сами. Когда вы объединяете две таблицы, то, что вы в действительности делаете, — это создаете пары, состоящие из каждой строки первой таблицы и каждой строки второй таблицы. Предложение WHERE действует как фильтр, позволяющий включать в результат только строки, которые соответствуют указанному предложению фильтрации — в данном случае предложению объединения. Без предложения WHERE каждая строка в первой таблице будет образовывать пару с каждой строкой второй таблицы независимо от того, есть логика в их объединении или нет.

Декартово произведение

Результаты, возвращаемые при умножении таблиц без указания условия объединения. Количество выбранных строк будет равно числу строк в первой таблице, умноженному на число строк во второй таблице.

      Для того чтобы разобраться в этом, посмотрите на следующий оператор SELECT и результат его применения:

SELECT vend_name, prod_name, prod_price FROM Vendors, Products;


 
vend name
prod name
prod_price
Bears R Us
8 inch teddy bear
5.99
Bears R Us
12 inch teddy bear
8.99
Bears R Us
18 inch teddy bear
11.99
Bears R Us
Fish bean bag toy
3.49
Bears R Us
Bird bean bag toy
3.49
Bears R Us
Rabbit bean bag toy
3.49
Bears R Us
Raggedy Ann
4.99
Bears R Us
King doll
9.49
Bears R Us
Queen doll
9.49
Bear Emporium
8 inch teddy bear
5.99
Bear Emporium
12 inch teddy bear
8.99
Bear Emporium
18 inch teddy bear
11.99
Bear Emporium
Fish bean bag toy
3.49
Bear Emporium
Bird bean bag toy
3.49
Bear Emporium
Rabbit bean bag toy
3.49
Bear Emporium
Raggedy Ann
4.99
Bear Emporium
King doll
9.49
Bear Emporium
Queen doll
9.49
Doll House Inc.
8 inch teddy bear
5.99
Doll House Inc.
12 inch teddy bear
8.99
Doll House Inc.
18 inch teddy bear
11.99
Doll House Inc.
Fish bean bag toy
3.49
Doll House Inc.
Bird bean bag toy
3.49
Doll House Inc.
Rabbit bean bag toy
3.49
Doll House Inc.
Raggedy Ann
4.99
Doll House Inc.
King doll
9.49
Doll House Inc.
Queen doll
9.49
Furball Inc.
8 inch teddy bear
5.99
Furball Inc.
12 inch teddy bear
8.99
Furball Inc.
18 inch teddy bear
11.99
Furball Inc.
Fish bean bag toy
3.49
Furball Inc.
Bird bean bag toy
3.49
Furball Inc.
Rabbit bean bag toy
3.49
Furball Inc.
Raggedy Ann
4.99
Furball Inc.
King doll
9.49
Furball Inc.
Queen doll
9.49
Fun and Games
8 inch teddy bear
5.99
Fun and Games
12 inch teddy bear
8.99
Fun and Games
18 inch teddy bear
11.99
Fun and Games
Fish bean bag toy
3.49
Fun and Games
Bird bean bag toy
3.49
Fun and Games
Rabbit bean bag toy
3.49
Fun and Games
Raggedy Ann
4.99
Fun and Games
King doll
9.49
Fun and Games
Queen doll
9.49
Jouets et ours
8 inch teddy bear
5.99
Jouets et ours
12 inch teddy bear
8.99
Jouets et ours
18 inch teddy bear
11.99
Jouets et ours
Fish bean bag toy
3.49
Jouets et ours
Bird bean bag toy
3 .49
Jouets et ours
Rabbit bean bag toy
3.49
Jouets et ours
Raggedy Ann
4.99
Jouets et ours
King doll
9.49
Jouets et ours
Queen doll
9.49

     Как видно из представленного результата, декартово произведение вы, скорее всего, будете использовать очень редко. Данные, возвращенные таким образом, ставят в соответствие каждому продукту каждого поставщика, включая продукты с указанием "не того" поставщика (и даже поставщиков, которые вообще не предлагают продуктов).

Не забудьте указать предложение WHERE

Проверьте, включили ли вы в оператор предложение where, иначе СУБД возвратит намного больше данных, чем вам нужно. Кроме того, убедитесь в том, что предложение where сформулировано правильно. Некорректное предложение фильтрования приведет к тому, что СУБД выдаст вам неверные данные.

Перекрестное объединение

Иногда объединение, которое возвращает декартово произведение, называют перекрестным объединением.