Es gibt eine Reihe von Möglichkeiten, dies zu tun, je nachdem, was Sie wirklich tun wollen. Ohne gemeinsame Säulen müssen Sie entscheiden, ob Sie eine gemeinsame Säule einführen oder das Produkt erhalten möchten.
Nehmen wir an, Sie haben die beiden Tabellen:
parts: custs:
+----+----------+ +-----+------+
| id | desc | | id | name |
+----+----------+ +-----+------+
| 1 | Sprocket | | 100 | Bob |
| 2 | Flange | | 101 | Paul |
+----+----------+ +-----+------+
Vergessen Sie die eigentlichen Spalten, da Sie höchstwahrscheinlich Haben in diesem Fall ein Kunden-/Auftrags-/Teileverhältnis; Ich habe diese Spalten nur verwendet, um die Vorgehensweise zu veranschaulichen.
Ein kartesisches Produkt gleicht jede Zeile in der ersten Tabelle mit jeder Zeile in der zweiten ab:
> select * from parts, custs;
id desc id name
-- ---- --- ----
1 Sprocket 101 Bob
1 Sprocket 102 Paul
2 Flange 101 Bob
2 Flange 102 Paul
Das ist wahrscheinlich nicht das, was Sie wollen, da 1000 Teile und 100 Kunden zu 100.000 Zeilen mit vielen doppelten Informationen führen würden.
Alternativ können Sie eine Vereinigung verwenden, um die Daten nur auszugeben, jedoch nicht nebeneinander (Sie müssen sicherstellen, dass die Spaltentypen zwischen den beiden Auswahlen kompatibel sind, indem Sie entweder die Tabellenspalten kompatibel machen oder sie in der Auswahl erzwingen ):
> select id as pid, desc, null as cid, null as name from parts
union
select null as pid, null as desc, id as cid, name from custs;
pid desc cid name
--- ---- --- ----
101 Bob
102 Paul
1 Sprocket
2 Flange
In einigen Datenbanken können Sie eine rowid/rownum-Spalte oder Pseudospalte verwenden, um Datensätze nebeneinander abzugleichen, wie z. B.:
id desc id name
-- ---- --- ----
1 Sprocket 101 Bob
2 Flange 101 Bob
Der Code wäre ungefähr so:
select a.id, a.desc, b.id, b.name
from parts a, custs b
where a.rownum = b.rownum;
Es ist immer noch wie ein kartesisches Produkt, sondern das where
-Klausel begrenzt, wie die Zeilen kombiniert werden, um die Ergebnisse zu bilden (also eigentlich überhaupt kein kartesisches Produkt).
Ich habe dieses SQL nicht darauf getestet, da es eine der Einschränkungen meines bevorzugten DBMS ist, und zu Recht glaube ich nicht, dass es jemals in einem richtig durchdachten Schema benötigt wird. Da SQL die Reihenfolge, in der es Daten erzeugt, nicht garantiert, kann sich der Abgleich bei jeder Abfrage ändern, es sei denn, Sie haben eine spezifische Beziehung oder order by
Klausel.
Ich denke, das Ideal wäre, beiden Tabellen eine Spalte hinzuzufügen, die angibt, was die Beziehung ist. Wenn es keine wirkliche Beziehung gibt, haben Sie wahrscheinlich kein Recht, sie neben SQL zu stellen.
Wenn Sie sie nur nebeneinander in einem Bericht oder auf einer Webseite (zwei Beispiele) anzeigen möchten, ist das richtige Tool dafür das, was Ihren Bericht oder Ihre Webseite generiert, gekoppelt mit zwei unabhängigen SQL-Abfragen zum Abrufen der beiden nicht verknüpften Tabellen. Beispielsweise ein zweispaltiges Raster in BIRT (oder Crystal oder Jasper) mit jeweils einer separaten Datentabelle oder eine zweispaltige HTML-Tabelle (oder CSS) mit jeweils einer separaten Datentabelle.