Il y a deux tables dans SQL Server
table1 (Id INT) table2 (Id INT)
dans la table1
il y a dix loggings et dans la table2
contient 0 logging
quand je choisis des deux tables
Select * from table1, table2
dans la window de sortie, il n'y a pas d'affichage des résultats.
mais quand j'ai inséré un nouvel logging dans la table 2 et que j'exécute à nouveau l'instruction select ci-dessus, il affichera l'logging table1 avec les loggings table2.
Je suis confus pourquoi la première sélection ne montre aucun logging?
10 * 0 = 0. Ce siple. Comme la table 2 contient 0 loggings, le jeu d'loggings résultant est vide = 0 lignes.
La requête produit quelque chose appelé produit cartésien, qui est fondamentalement chaque logging d'une table jointe à une autre d'un autre. Par conséquent, le nombre total d'loggings renvoyés est
(records in Table1) x (records in Table2)
Mais puisque Table2 a 0 loggings, le produit Cross a 0 loggings – parce qu'il n'a pas pu find d'logging dans l'autre table à join avec chaque logging dans la première table.
Lorsque vous select plusieurs tables séparées par des virgules, vous requestz un "produit cartésien" (voir https://secure.wikimedia.org/wikipedia/en/wiki/Cartesian_product ) des deux tables. Si la table table1 a des loggings X et que table2 a des loggings Y, alors le résultat contiendra des loggings X * Y. C'est zéro loggings si l'une des tables contient zéro loggings.
FROM table1, table2
est un produit cartésien des deux tables, le même que
FROM table1 CROSS JOIN table2
Les deux montreront chaque combinaison d'une ligne de table1 avec une ligne de table2.
Donc, 10 x 0 = 0
combinaisons.
L'opération que vous faites s'appelle une jointure cartésienne (multiplication multiset): elle va afficher toutes les combinaisons d'loggings possibles dans les tables.
Comme il n'y a pas d'loggings dans la seconde table, il n'y a pas de combinaisons possibles.
Si vous voulez concaténer les multisets (faire une addition multiset), utilisez UNION ALL
place:
SELECT id FROM table1 UNION ALL SELECT id FROM table2