Compreender o produto cartesiano em SQL
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.
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.