Entwickler-Ecke

Datenbanken - SQL-Anweisung Join 2er Tabellen (Oracle >= 9)


Biergeneral - So 30.11.08 01:25
Titel: SQL-Anweisung Join 2er Tabellen (Oracle >= 9)
Hallo,

ich bin auf der Suche nach einer performanten Möglichkeit, 2 Tabellen zu in Oracle zu kombinieren. Dabei hab ich das Problem, dass ich aus Tabelle 2 Zeileninhalte in verschiedene Spalten kopieren muss:


Verwendet wird Oracle >= Version 9.
Als Anbindung zur Datenbank nutze ich ADO


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
{Tabelle1}
  ID, Wert1, Wert2, WertN
   0|   ABC|   ASD|   12N|
   1|   BCD|   ASE|   13N|

// Wert1 ist der Primärschlüssel, die ID ist ein Unique Feld
{Tabelle2}
  
  ID, Name, Wert
   0|  XX1|  AB0
   0|  XX2|  AB1
   1|  XX1|  123
   1|  XX2|  456

// ID entspricht der ID aus Tabelle1
{Zieltabelle Tabelle}
  ID, Wert1, Wert2, WertN, XX1, XX2
   0|   ABC|   ASD|   12N| AB0|  AB1
   1|   BCD|   ASE|   13N| 123|  456



Das ganze bewegt sich in einer Größenordnung von 20.000 Einträgen in Tabelle 1 und etwa 20-60 Attributen pro Eintrag in Tabelle2, wobei die genau Anzahl unterschiedlich sein kann.
Die Inhalte der Spalte "Name" sind mir vor dem Auslesen bekannt. Mein letzter Ansatz sah daher so aus:


SQL-Anweisung
1:
2:
3:
4:
5:
6:
SELECT * FROM "Tabelle1" A JOIN
(SELECT DISTINCT "ID", V1 AS "XX1", V2 AS "XX2" FROM "Tabelle2",
(SELECT "WERT" AS V1,"ID" AS ID1 FROM "Tabelle2" WHERE "WERT"='XX1'),
(SELECT "WERT" AS V2,"ID" AS ID2 FROM "Tabelle2" WHERE "WERT"='XX2')
WHERE "ID"=ID1 AND ID1=ID2) B
ON A."ID" = B."ID"


Sprich, für jede Spalte die ich anhängen wollte, kam ein SubQuery dazu.. Das ist allerdings ziemlig langsam.

Mit meinen heldenhaften SQL-Kentnissen bin ich nu auch am Ende :-D
Daher: Gibt es noch einen Besseren weg, abgesehen davon, die beiden Tabellen separat auszulesen und programmintern zusammenzuführen?

Nächtliche Grüße vom Biergeneral


Bernhard Geyer - So 30.11.08 11:35

{Tabelle2} wirst du per PIVOT-Umwandlung transformieren müssen. Wie dort die Syntax bei Oracle ist weis ich nicht.