Zwei Tabellen per Select-Abfrage besser kombinieren

Steve6

Aktiver Benutzer
Beiträge
26
Hallo,

ich habe (für mich) ein Problem mit dem "verbinden" zweier Tabellen in Oracle.

In meinem Anhang habe ich die vorgegebenen Tabellen und die Zieltabellen (TabelleD) aufgeführt.

Tabelle A und Tabelle B habe ich.

Durch eine einfache SELECT-Abfrage kann ich diese über TabelleA.ART_NR und TabelleB.ART_ONR verbinden. Dann erhalte ich TabelleC

Ich möchte es aber gerne wie in TabelleD gezeigt aufgebaut haben, damit die Artikel nicht mehrfach auftauchen und die Tabelle kürzer wird usw.
Meine Frage: Geht das mit Oracle-SQL-Hausmitteln (Oracle 11g R2)?

Gruß, Steve
 

Anhänge

  • Tabellen.pdf
    69,7 KB · Aufrufe: 13
Werbung:
ausgehend von Deiner Tabelle C und mit PostgreSQL:

Code:
test=*# select * from tab_c;
 artikel |  a_text  |  a_einh  
---------+----------+----------
 art_a  | rot  | farbe
 art_a  | achteck  | form
 art_a  | groß  | groesse
 art_b  | metall  | material
 art_b  | sechseck | form
(5 Zeilen)

test=*# select artikel, array_to_string(array_agg(a_text) filter (where a_einh='farbe'),'') as farbe, array_to_string(array_agg(a_text) filter (where a_einh='form'),'') as form, array_to_string(array_agg(a_text) filter (where a_einh='groesse'),'') as groesse, array_to_string(array_agg(a_text) filter (where a_einh='material'),'') from tab_c group by artikel;
 artikel | farbe |  form  | groesse | array_to_string
---------+-------+----------+---------+-----------------
 art_a  | rot  | achteck  | groß  |
 art_b  |  | sechseck |  | metall
(2 Zeilen)

Könnte in Oraggle vielleicht recht ähnlich gehen.
 
Das geht über die pivot Funktion:

Code:
select * from
  (select artikel,art_nr,... FROM a,b where a.art_nr=b.art_onr)
PIVOT
(
  MIN(art_text)
  FOR art_ein
  IN('FARBE (84)','FORM(58)',...)
)
ORDER BY artikel
 
Hallo und Danke für die Antworten.

@akretschmer: Leider steigt Oracle bei dem Filter aus. Es gibt bestimmt noch vergleichbares bei Oracle aber die Pivot-Funktion funktioniert.

@drdimitri: danke für den Tipp. Diese Funktion kannte ich noch nicht. Ich habe als Ergebnis allerdings immer den Artikel doppelt in der Liste. Da muss ich noch prüfen woran das liegt.

Vielen Dank
 
Hi,

das

Code:
array_agg(a_text) filter (where a_einh='farbe')

kann man auch umschreiben zu

Code:
array_agg(case ehen a_einh='farbe' then a_text else NULL end)

das ist die 'klassische' Syntax, die auch weniger gute Datenbanken in der Regel verstehen. Das nur als Nachtrag.
 
array_agg ist in Oracle nicht implementiert. Ist im SQL 2011 Standard auch nur optional.

Aus der Doku:
Oracle does not have an aggregate that results in a varray. Instead, the COLLECT aggregate may be used to create a multiset, which can be cast to an array of the element type.
 
Ohne jetzt die ganz große Ahnung zu haben aber könnte sowas nicht auch mit dem Merge Command in Verbindung mit Pseudo-column gehen ?

grüße skyerjoe
 
Werbung:
In manchen Foren wird die "collect" funtkion als equivalent dazu angesehen ....

Google doch einfach mal danach ein bißchen

grüße skyerjoe
 
Zurück
Oben