Объединение таблиц
- Что такое объединения? и Что такое реляционные таблицы?
- Создание объединения
- Важность предложения WHERE
- Внутренние объединения
- Объединение многих таблиц
Важность предложения WHERE
Может показаться странным использование предложения WHERE для установления отношения в объединении, но на это есть существенная причина. Вспомните: когда таблицы объединяются в операторе SELECT, это отношение создается "на лету".
В определениях таблиц базы данных ничего не говорится о том, как СУБД должна объединять таблицы. Вы должны указать это сами. Когда вы объединяете две таблицы, то, что вы в действительности делаете, — это создаете пары, состоящие из каждой строки первой таблицы и каждой строки второй таблицы. Предложение WHERE действует как фильтр, позволяющий включать в результат только строки, которые соответствуют указанному предложению фильтрации — в данном случае предложению объединения. Без предложения WHERE каждая строка в первой таблице будет образовывать пару с каждой строкой второй таблицы независимо от того, есть логика в их объединении или нет.
Декартово произведение
Для того чтобы разобраться в этом, посмотрите на следующий оператор SELECT и результат его применения:
|
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 сформулировано правильно. Некорректное предложение фильтрования приведет к тому, что СУБД выдаст вам неверные данные.
Перекрестное объединение



