SQL server Abfrage Ausgabe?

Es gibt zwei Tabellen in SQL server

table1 (Id INT) table2 (Id INT) 

In table1 gibt es zehn datasätze und in table2 enthält 0 datasatz

wenn ich aus beiden Tabellen wähle

 Select * from table1, table2 

im Ausgabefenster gibt es keine Ergebnisanzeige ..

aber wenn ich einen neuen datasatz in table2 eingefügt und wieder die gleiche oben select select ausführen, dann wird es table1 datasatz zusammen mit table2 datasätze anzeigen.

Ich werde verwirrt, warum die erste select-statement keinen datasatz zeigt?

10 * 0 = 0. Das ist das. Da Tabelle 2 0 datasätze enthält, ist der resultierende datasatz leer = 0 Zeilen.

Die Abfrage produziert etwas namens Cartesian Product, die im Grunde jeden Rekord von einem Tisch mit jedem anderen von einem anderen verbunden ist. Daher ist die Gesamtzahl der zurückgesendeten datasätze

 (records in Table1) x (records in Table2) 

Aber da Table2 0 datasätze hat, hat das Cross-Produkt 0 datasätze – weil es keinen datasatz in einer anderen Tabelle finden konnte, um mit jedem datasatz in der ersten Tabelle zu verbinden.

Wenn Sie aus mehreren Tabellen auswählen, die mit Komma getrennt sind, dann fragen Sie tatsächlich nach einem "kartesischen Produkt" (siehe https://secure.wikimedia.org/wikipedia/en/wiki/Cartesian_product ) der beiden Tabellen. Wenn table table1 hat X datasätze und table2 hat Y datasätze, dann das Ergebnis enthält X * Y datasätze. Das ist null, wenn eine der Tabellen null datasätze enthält.

 FROM table1, table2 

ist ein kartesisches Produkt der beiden Tische, das gleiche wie

 FROM table1 CROSS JOIN table2 

Beide zeigen jede Kombination einer Zeile aus Tabelle1 mit einer Zeile aus Tabelle2.

Also, 10 x 0 = 0 Kombinationen.

Die Operation, die Sie tun, heißt eine kartesische Verknüpfung (Multiset-Multiplikation): Sie werden alle möglichen Kombinationen von datasätzen in den Tabellen ausgeben.

Da es keine Aufzeichnungen in der zweiten Tabelle gibt, gibt es keine Kombinationen möglich.

Wenn Sie die Multisets verketten möchten (eine Multiset-Ergänzung verwenden), verwenden Sie UNION ALL statt:

 SELECT id FROM table1 UNION ALL SELECT id FROM table2