sql >> Database teknologi >  >> RDS >> Sqlserver

Kombiner to tabeller, der ikke har nogen fælles felter

Der er en række måder at gøre dette på, afhængigt af hvad du virkelig vil have. Uden fælles kolonner skal du beslutte, om du vil introducere en fælles kolonne eller få produktet.

Lad os sige, at du har de to tabeller:

parts:              custs:
+----+----------+   +-----+------+
| id | desc     |   |  id | name |
+----+----------+   +-----+------+
|  1 | Sprocket |   | 100 | Bob  |
|  2 | Flange   |   | 101 | Paul |
+----+----------+   +-----+------+

Glem de faktiske kolonner, da du højst sandsynligt ville have et kunde-/ordre-/delforhold i dette tilfælde; Jeg har lige brugt disse kolonner til at illustrere måderne at gøre det på.

Et kartesisk produkt vil matche hver række i den første tabel med hver række i den anden:

> select * from parts, custs;
      id desc     id  name
      -- ----     --- ----
      1  Sprocket 101 Bob
      1  Sprocket 102 Paul
      2  Flange   101 Bob
      2  Flange   102 Paul

Det er sandsynligvis ikke, hvad du ønsker, da 1000 dele og 100 kunder ville resultere i 100.000 rækker med masser af duplikeret information.

Alternativt kan du bruge en union til blot at udlæse dataene, dog ikke side om side (du skal sikre dig, at kolonnetyper er kompatible mellem de to valg, enten ved at gøre tabelkolonnerne kompatible eller tvinge dem til at vælge ):

> 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

I nogle databaser kan du bruge en række-/rækkenummer-kolonne eller pseudo-kolonne til at matche poster side om side, såsom:

id desc     id  name
-- ----     --- ----
1  Sprocket 101 Bob
2  Flange   101 Bob

Koden ville være noget i stil med:

select a.id, a.desc, b.id, b.name
from parts a, custs b
where a.rownum = b.rownum;

Det er stadig lignende et kartesisk produkt, men where klausul begrænser, hvordan rækkerne kombineres for at danne resultaterne (så ikke et kartesisk produkt overhovedet).

Jeg har ikke testet den SQL for dette, da det er en af ​​begrænsningerne i mit DBMS-valg, og med rette tror jeg aldrig, at det er nødvendigt i et ordentligt gennemtænkt skema. Da SQL ikke garanterer den rækkefølge, som det producerer data i, kan matchningen ændre sig, hver gang du foretager forespørgslen, medmindre du har en specifik relation eller order by klausul.

Jeg tror, ​​at den ideelle ting at gøre ville være at tilføje en kolonne til begge tabeller, der angiver, hvad forholdet er. Hvis der ikke er noget reelt forhold, så har du sandsynligvis ikke noget at gøre med at forsøge at sætte dem side om side med SQL.

Hvis du bare vil have dem vist side om side i en rapport eller på en webside (to eksempler), er det rigtige værktøj til at gøre det, hvad end der genererer din rapport eller webside, kombineret med to uafhængige SQL-forespørgsler for at få de to ikke-relaterede tabeller. For eksempel et gitter med to kolonner i BIRT (eller Crystal eller Jasper) hver med en separat datatabel eller en HTML-tabel med to kolonner (eller CSS) hver med en separat datatabel.



  1. FGCB_ADD_REMOVE-låsen

  2. Sådan viser du skjulte elementer i VBA-objektbrowseren

  3. Deaktiver ONLY_FULL_GROUP_BY

  4. Sammenligning af Oracle MySQL, Percona Server og MariaDB