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

Combina due tabelle che non hanno campi comuni

Esistono diversi modi per farlo, a seconda di cosa realmente volere. Senza colonne comuni, devi decidere se vuoi introdurre una colonna comune o ottenere il prodotto.

Supponiamo che tu abbia le due tabelle:

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

Dimentica le colonne effettive poiché molto probabilmente avresti una relazione cliente/ordine/parte in questo caso; Ho appena usato quelle colonne per illustrare i modi per farlo.

Un prodotto cartesiano abbinerà ogni riga della prima tabella con ogni riga della seconda:

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

Probabilmente non è quello che vuoi, dal momento che 1000 parti e 100 clienti risulteranno in 100.000 righe con molte informazioni duplicate.

In alternativa, puoi utilizzare un'unione solo per generare i dati, anche se non affiancati (dovrai assicurarti che i tipi di colonna siano compatibili tra le due selezioni, rendendo compatibili le colonne della tabella o costringendole nella selezione ):

> 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 alcuni database, puoi utilizzare una colonna rowid/rownum o una pseudo-colonna per abbinare i record affiancati, ad esempio:

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

Il codice sarebbe qualcosa del tipo:

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

È ancora come un prodotto cartesiano ma il where La clausola limita il modo in cui le righe vengono combinate per formare i risultati (quindi non è affatto un prodotto cartesiano, in realtà).

Non ho testato quell'SQL per questo poiché è uno dei limiti del mio DBMS preferito e, giustamente, non credo che sia mai necessario in uno schema adeguatamente congegnato. Poiché SQL non garantisce l'ordine in cui produce i dati, la corrispondenza può cambiare ogni volta che esegui la query a meno che tu non abbia un specifico relazione o order by clausola.

Penso che la cosa ideale da fare sarebbe aggiungere una colonna a entrambe le tabelle specificando qual è la relazione. Se non c'è una vera relazione, probabilmente non hai motivo di provare a metterli fianco a fianco con SQL.

Se vuoi solo che vengano visualizzati fianco a fianco in un rapporto o in una pagina web (due esempi), lo strumento giusto per farlo è qualunque cosa generi il tuo rapporto o pagina web, insieme a due indipendenti Query SQL per ottenere le due tabelle non correlate. Ad esempio, una griglia a due colonne in BIRT (o Crystal o Jasper) ciascuna con una tabella dati separata, o una tabella HTML a due colonne (o CSS) ciascuna con una tabella dati separata.