Oracle: Gleichartige Daten aus zwei Tabellen abfragen

16 10 2009

Die Problemstellung war, gleichartige Daten, die über zwei verschiedene Tabellen verteilt sind in einer Ergebnismenge zu erhalten. Wir legen uns also zwei Test-Tabellen mit ein paar Daten an.

SQL> desc tab1
Name      Null?    Type
--------- -------- ---------------------------
FELD1              VARCHAR2(100 CHAR)
FELD2              VARCHAR2(100 CHAR)
FELD3              VARCHAR2(100 CHAR)

SQL> desc tab2
Name      Null?    Type
--------- -------- ---------------------------
FELD1              VARCHAR2(100 CHAR)
FELD2              VARCHAR2(100 CHAR)
FELD3              VARCHAR2(100 CHAR)
FELD4              VARCHAR2(100 CHAR)
FELD5              VARCHAR2(100 CHAR)

SQL> select * from tab1;

FELD1      FELD2      FELD3
---------- ---------- ----------
aaaaa      bbbbb      201001
ccccc      ddddd      201001
eeeee      fffff      201001
ggggg      hhhhh      201001
iiiii      jjjjj      201002

SQL> select * from tab2;

FELD1      FELD2      FELD3      FELD4      FELD5
---------- ---------- ---------- ---------- ----------
kkkkk      lllll      201001     uuuuu      vvvvv
mmmmm      nnnnn      201001     wwwww      xxxxx
ooooo      ppppp      201001     yyyyy      zzzzz
qqqqq      rrrrr      201002     11111      22222
sssss      ttttt      201002     33333      44444

So lange die abgefragten Spalten in beiden Tabellen identisch sind kein größeres Problem.

SQL> SELECT
feld1,
feld2,
feld3
FROM tab1
UNION
SELECT
feld1,
feld2,
feld3
FROM tab2
ORDER BY feld3 ASC;

FELD1      FELD2      FELD3
---------- ---------- ----------
aaaaa      bbbbb      201001
ccccc      ddddd      201001
eeeee      fffff      201001
ggggg      hhhhh      201001
kkkkk      lllll      201001
mmmmm      nnnnn      201001
ooooo      ppppp      201001
iiiii      jjjjj      201002
qqqqq      rrrrr      201002
sssss      ttttt      201002

10 rows selected.

Benötigen wir allerdings eine unterschiedliche Anzahl an Spalten je Tabelle, funktioniert dieses Vorgehen so nicht mehr:

SQL> SELECT *
FROM tab1
UNION
SELECT *
FROM tab2;

ERROR at line 1:
ORA-01789: query block has incorrect number of result columns

SAS bietet hierfür das OUTER UNION CORR.

SELECT * FROM (
SELECT * FROM tab1
OUTER UNION CORR
SELECT * FROM tab2
)
ORDER BY feld3 ASC;

Etwas vergleichbares gibt es in Oracle nicht. Wir müssen die Anzahl der Spalten in den Tabellen also faken.

SQL> SELECT
  feld1,
  feld2,
  feld3,
  null as feld4,
  null as feld5
FROM tab1
UNION
SELECT
  feld1,
  feld2,
  feld3,
  feld4,
  feld5
FROM tab2
ORDER BY feld3 ASC

FELD1      FELD2      FELD3      FELD4      FELD5
---------- ---------- ---------- ---------- ----------
aaaaa      bbbbb      201001
ccccc      ddddd      201001
eeeee      fffff      201001
ggggg      hhhhh      201001
kkkkk      lllll      201001     uuuuu      vvvvv
mmmmm      nnnnn      201001     wwwww      xxxxx
ooooo      ppppp      201001     yyyyy      zzzzz
iiiii      jjjjj      201002
qqqqq      rrrrr      201002     11111      22222
sssss      ttttt      201002     33333      44444

10 rows selected.
Advertisements

Aktionen

Information

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s




%d Bloggern gefällt das: