sql >> Database >  >> RDS >> Sqlserver

Combineer twee tabellen die geen gemeenschappelijke velden hebben

Er zijn een aantal manieren om dit te doen, afhankelijk van wat je echt wil. Omdat er geen gemeenschappelijke kolommen zijn, moet u beslissen of u een gemeenschappelijke kolom wilt introduceren of het product wilt kopen.

Laten we zeggen dat je de twee tabellen hebt:

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

Vergeet de eigenlijke kolommen, aangezien u hoogstwaarschijnlijk heeft in dit geval een klant/bestelling/deelrelatie; Ik heb zojuist die kolommen gebruikt om de manieren te illustreren om dit te doen.

Een cartesiaans product komt overeen met elke rij in de eerste tabel met elke rij in de tweede:

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

Dat is waarschijnlijk niet wat je wilt, aangezien 1000 onderdelen en 100 klanten resulteren in 100.000 rijen met veel dubbele informatie.

Als alternatief kunt u een unie gebruiken om alleen de gegevens uit te voeren, maar niet naast elkaar (u moet ervoor zorgen dat kolomtypen compatibel zijn tussen de twee selecties, door de tabelkolommen compatibel te maken of ze te dwingen in de select ):

> 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 sommige databases kunt u een rowid/rownum-kolom of pseudo-kolom gebruiken om records naast elkaar te matchen, zoals:

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

De code zou zoiets zijn als:

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

Het is nog steeds zoals een cartesiaans product maar de where clausule beperkt hoe de rijen worden gecombineerd om de resultaten te vormen (dus eigenlijk helemaal geen cartesiaans product).

Ik heb die SQL hiervoor niet getest, omdat het een van de beperkingen is van mijn DBMS naar keuze, en terecht, ik geloof niet dat het ooit nodig is in een goed doordacht schema. Aangezien SQL de volgorde waarin het gegevens produceert niet garandeert, kan de overeenkomst elke keer dat u de query uitvoert veranderen, tenzij u een specifieke heeft relatie of order by clausule.

Ik denk dat het ideaal zou zijn om aan beide tabellen een kolom toe te voegen waarin wordt aangegeven wat de relatie is. Als er geen echte relatie is, dan heb je er waarschijnlijk niets aan om ze naast SQL te plaatsen.

Als u ze gewoon naast elkaar wilt weergeven in een rapport of op een webpagina (twee voorbeelden), is de juiste tool om dat te doen wat uw rapport of webpagina genereert, in combinatie met twee onafhankelijke SQL-query's om de twee niet-gerelateerde tabellen te krijgen. Bijvoorbeeld een raster met twee kolommen in BIRT (of Crystal of Jasper) met elk een aparte gegevenstabel, of een HTML-tabel met twee kolommen (of CSS) met elk een aparte gegevenstabel.



  1. FIND_IN_SET() versus IN()

  2. Importeer CSV-bestand rechtstreeks in MySQL

  3. Een SQL Server Agent-schema wijzigen (T-SQL)

  4. Veiligheidsnetten