sql >> Databasteknik >  >> RDS >> Sqlserver

Kombinera två tabeller som inte har några gemensamma fält

Det finns ett antal sätt att göra detta, beroende på vad du verkligen vilja. Utan gemensamma kolumner måste du bestämma om du vill introducera en gemensam kolumn eller skaffa produkten.

Låt oss säga att du har de två tabellerna:

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

Glöm de faktiska kolumnerna eftersom du sannolikt skulle ha ett kund-/order-/delförhållande i detta fall; Jag har precis använt dessa kolumner för att illustrera sätten att göra det.

En kartesisk produkt matchar varje rad i den första tabellen med varje rad i den andra:

> 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 är förmodligen inte vad du vill eftersom 1000 delar och 100 kunder skulle resultera i 100 000 rader med massor av duplicerad information.

Alternativt kan du använda en fackförening för att bara mata ut data, men inte sida vid sida (du måste se till att kolumntyperna är kompatibla mellan de två valen, antingen genom att göra tabellkolumnerna kompatibla eller tvinga dem i valet ):

> 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 vissa databaser kan du använda en rad/radnummer-kolumn eller pseudo-kolumn för att matcha poster sida vid sida, till exempel:

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

Koden skulle vara något i stil med:

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

Det är fortfarande likt en kartesisk produkt men where klausul begränsar hur raderna kombineras för att bilda resultaten (så inte en kartesisk produkt alls, egentligen).

Jag har inte testat den SQL för detta eftersom det är en av begränsningarna i mitt DBMS-val, och med rätta tror jag inte att det någonsin behövs i ett väl genomtänkt schema. Eftersom SQL inte garanterar i vilken ordning den producerar data, kan matchningen ändras varje gång du gör frågan om du inte har en specifik relation eller order by klausul.

Jag tror att det idealiska skulle vara att lägga till en kolumn i båda tabellerna som anger vad förhållandet är. Om det inte finns någon verklig relation, har du förmodligen ingen anledning att försöka sätta dem sida vid sida med SQL.

Om du bara vill att de ska visas sida vid sida i en rapport eller på en webbsida (två exempel), är det rätta verktyget för att göra det vad som än genererar din rapport eller webbsida, tillsammans med två oberoende SQL-frågor för att få de två orelaterade tabellerna. Till exempel ett rutnät med två kolumner i BIRT (eller Crystal eller Jasper) var och en med en separat datatabell, eller en HTML-tabell med två kolumner (eller CSS) var och en med en separat datatabell.



  1. Hur man uppgraderar PostgreSQL 11 till PostgreSQL 12 med noll driftstopp

  2. Hur frågar jag efter alla datum som är större än ett visst datum i SQL Server?

  3. Vad är Greenplum Database? Introduktion till Big Data-databasen

  4. Bestäm rankning baserat på flera kolumner i MySQL