Compreender o produto cartesiano em SQL

Não consigo entender como funciona o produto cartesiano. Considere o esquema simples:

mysql> select * from account;
+----------------+-------------+---------+
| account_number | branch_name | balance |
+----------------+-------------+---------+
| A101           | Downtown    |     500 |
| A102           | Perryridge  |     400 |
| A201           | Brighton    |     900 |
| A215           | Mianus      |     700 |
| A217           | Brighton    |     750 |
| A222           | Redwood     |     700 |
| A305           | Round Hill  |     350 |
+----------------+-------------+---------+
7 rows in set (0.00 sec)
Agora, quando eu colocar a questão

select a.balance from account a, account b where a.balance<b.balance;

recebo uma série de valores excepto o valor máximo 900. Então usando o operador not in eu determino o valor máximo. Antes disso, na consulta acima, quando a junção ocorre com base na condição a.balance<b.balance, a primeira tupla na relação deve ser 500. Teoricamente, os primeiros 5 valores devem ser:

500
500
500
500
400
Mas eu entendo. :

+---------+
| balance |
+---------+
|     400 |
|     350 |
|     350 |
|     500 |
|     400 |
Como está a funcionar? Estou a usar a base de dados MySQL.

Author: Mureinik, 2015-06-20

1 answers

Uma junção cartesiana junta todos os recordes na primeira mesa com todos os recordes na segunda mesa, por isso, uma vez que a sua mesa tem 7 linhas e está unida a si própria, deve devolver 49 registos se não tivesse uma cláusula {[[0]}. A cláusula "where" só permite registos em que o saldo de a é inferior ao saldo de b. Uma vez que 900 é, como você disse, o equilíbrio máximo na tabela, ele nunca será menor do que qualquer outro equilíbrio, e, portanto, nunca será devolvido.

No que diz respeito à as primeiras cinco linhas, as regras normais do SQL aplicam-se também aos junções. Uma vez que as tabelas SQL não têm ordem intrínseca, cabe completamente ao banco de dados decidir como devolvê-las, a menos que você explicitamente declare uma ordem na cláusula order by. Os valores que você listou são valores perfeitamente válidos que você esperaria que a consulta retornasse.

 3
Author: Mureinik, 2015-06-20 15:01:04