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.