Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Kombinieren Sie zwei Tabellen, die keine gemeinsamen Felder haben

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.