PostgreSQL multiple SELECT / verketten

dbbastler

Benutzer
Beiträge
6
Hallo Wissende,

ich habe ein Problem mit einem verketteten / multiplen SELECT bei PostgreSQL und bekomme es einfach nicht gelöst.

Ich habe zwei Tabellen in denen drei gefragte Werte stecken und ich möchte lediglich eine Tabelle mit einer Spalte als Ausgabe.

Beispiel: Tabelle ta und Tabelle tb enthalten je Werte in den Spalten name und value.
SELECT ta.value FROM ta WHERE ta.name = 'parama'; ergibt 1 Zeile, i.O.
SELECT ta.value FROM ta WHERE ta.name = 'paramb'; ergibt 1 Zeile, i.O.
SELECT tb.value FROM tb WHERE tb.name = 'user'; ergibt 10 Zeilen, i.O.

SELECT ta.value, tb.value FROM ta, tb WHERE (ta.name = 'parama' OR ta.name = 'paramb') AND tb.name = 'user';
ergibt 20 Zeilen Ergebnis, in diesem Beispiel sollten aber 10 Zeilen Ergbnis wie folgt erscheinen:
ta.value ta.value tb.value

Wobei das erste ta.value immer vom ersten WHERE mit ta.name = 'parama' und das zweite ta.value immer vom zweiten WHERE mit ta.name = 'paramb' kommt. Mein Problem ist, dass zwei der Parameter in der gleichen Tabelle stehen aber in der gleichen Ausgabezeile nur 1x erscheinen sollen. Ich habe schon mit STRING_ACC und CONCAT experimentiert - ohne Erfolg.

Nun die Frage: Wie bekomme ich das gewünschte Ergebnis hin? Ein SELECT im SELECT?

Mein Problem ist auch, dass mir schon das Stichwort fehlt, wonach ich suchen könne. Multiples Select oder concat usw. haben bisher keine brauchbaren Ergebnisse geliefert.

Danke im Voraus
 
Werbung:
Ach je, manchmal liegt die Lösung so nahe. Nach Stunden suchen finde ich zufällig sieben Posts darunter einen Teil der Lösung. Aktuell funktioniert:

SELECT ta.value, tavalue, tb.value FROM ta, (SELECT ta.value as tavalue FROM ta WHERE ta.name = 'paramb') AS SUBQUERY WHERE ta.name = 'parama' AND tb.name = 'user';

Das nun noch mit concat verknüpft und schon habe ich das gewünschte Ergebnis.

Dann hier abschließend die Frage: Sollte man das umschreiben weil es anderweitig einfacher zu lösen ist oder gibt es klar besseren Syntax?
 
Stichwort
Union
denke ich hilft dir ;)

Beispielcode:
Code:
create table ta(value int);
create table tb(value int);
insert into ta values (1);
insert into tb values (1);
select ta.value from ta where 1 = 1
union all
select ta.value from ta where 2 = 2
union all
select tb.value from tb;

Resultat:
Code:
1
1
1

schnelle Erklärung:
ein jede Abfrage vor oder nach dem union kann selbstständig stehen, und das ergebniss wird übereinander ausgegeben, wenn du das brauchst, wie ich denke (?)

EDIT:
Wenn alle Werte nur einmal ausgegeben werden sollen, einfach nur "union" schreiben, nicht "union all" ;)

EDIT2:
Den Wert nur einmal ausgeben schaut dann so aus:
Code:
select ta.value from ta where 1 = 1
union
select ta.value from ta where 2 = 2
union
select tb.value from tb;

Code:
1
 
Zuletzt bearbeitet:
Mit dem Union komme ich leider nicht weiter, das aggreggiert nur alle Ergebnisse, ich bekomme (lt. meinem Beispiel) 12 Ergebniszeilen:10+1+1, 'willkürlich' sortiert.

Gerade bemerkt: in der 'Lösung' oben fehlt noch das from tb. Besser sieht das so aus:
SELECT ta.value, tavalue, tb.value FROM ta, tb, (SELECT ta.value as tavalue FROM ta WHERE ta.name = 'paramb') AS SUBQUERY WHERE ta.name = 'parama' AND tb.name = 'user';
 
Ich denke, der TE möchte JOINen, nicht UNION.
Er will die Einzelergebnisse nebeneinander, nicht untereinander.

SELECT ta.value, tavalue, tb.value FROM ta, (SELECT ta.value as tavalue FROM ta WHERE ta.name = 'paramb') AS SUBQUERY WHERE ta.name = 'parama' AND tb.name = 'user';
Das liefert ja vermutlich das Ergebnis, aber das Statement ist etwas "eigenwillig".

Angenommen, jeder der Einzelabfrage liefert garantiert nur eine Zeile, wäre der normalste Weg:
Code:
select a1.tavalue as a1value, 
       a2.tavalue as a2value,
       b.value
  from ta a1, ta a2, tb b
 where a1.name = 'parama' 
   and a2.name = 'paramb'
   and b.name= 'user';
 
Angenommen, jeder der Einzelabfrage liefert garantiert nur eine Zeile, wäre der normalste Weg:
Ich habe leider nur zwei Tabellen. In einer stehen zwei Werte, daher. Aber ja: hätte ich drei Tabellen dann wäre deine Lösung passend.

Ich habe eine Parametertabelle (10k Einträge oder so) in der gesammelt alles drin steht. Daher eben auch mal mehrere Ergebnisse aus dieser in einer Abfrage.
 
@dabadepdu fragt auch nur zwei Tabellen ab, eine davon aber eben doppelt. Er joint eine Tabelle mit sich selbst und joint dann noch die andere Tabelle, das sieht schon nach deinem Wunschergebnis aus.
 
Werbung:
Zurück
Oben