pgSQL - Abfrage

MarcoPolo

Neuer Benutzer
Beiträge
4
Hallo!
Ich würde gerne aus einer Spalte gezielt die werte trennen und abbilden.

Eine tab_1 und eine tab_2 ist gegeben.

Sie stehen folgendermaßen in Beziehung:

tab_1.id = tab_2.rid

Die Tabellen stehen in einer 1 zu N Beziehung zueinander. Das heißt während bei tab_1 die id = "1" einmal vorkommt, wird die rid = "1" zweimal vorkommen.

Jetzt möchte ich ganz gerne die Spalte in tab_2(tab_2.werte) in zwei Spalten aufteilen. Die Werte ,it 6100,6200,... sollen in der Spalte tab_2.klimastufe angezeigt werden.
Die Werte mit 7100,7200,... sollen in einer Spalte tab_2.wasserstufe angezeigt werden.

Ich hoffe das ist verständlich.. ansonsten im Folgenden einmal 2 Abfragen, um beide Spalten einzelnt anzeigen zu lassen: (ich brauche die Anzeige beider Spalten gleichzeitig)

SQL Quellcode:

Code:
SELECT tab_2.wert AS wasserstufe
FROM tab_2
INNER JOIN tab_1
ON tab_2.rid = tab_1.id
WHERE tab_2.wert LIKE '%7%' AND ST_Intersects(AsText(tab_1.the_geom), ('POLYGON ((...))'));
 
SELECT tab_2.wert AS klimastufe FROM tab_2
INNER JOIN tab_1
ON tab_2.rid = tab_1.id
WHERE tab_2.wert LIKE '%6%' AND ST_Intersects(AsText(tab_1.the_geom), ('POLYGON ((...))'));

Vielen Dank schonmal für's Zeit nehmen... ich bin für jeden Tipp dankbar!
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.770
Also wenn ich dich richtig verstehe hast du eine Haupttabelle mit eindeutiger ID und eine Tabelle mit je 2 Einträgen (Datensätzen zu Klima- und Wasserstufe) die per Fremdschlüssel auf einen Eintrag in der Haupttabelle verweisen. Jetzt möchtest du in der Haupttabelle 2 neue Spalten anlegen in die jeweils die Werte für Klima- und Wasserstufe geschrieben werden sollen.

Code:
ALTER TABLE tab_1 ADD COLUMN wasserstufe INT
 
UPDATE    tab_1
SET        tab_1.wasserstufe = (    SELECT    tab_2.wert
                                FROM    tab_2
                                WHERE    tab_2.rid = tab_1.id
                                AND        tab_2.wert LIKE '%7%'
                                AND        ST_Intersects(AsText(tab_1.the_geom), ('POLYGON ((...))')) )

Oder sollen diese Werte weiterhin in der Nebentabelle bleiben und dort neue Spalten entstehen? (Wäre die weniger sinnvolle Variante)
 

MarcoPolo

Neuer Benutzer
Beiträge
4
Ja, so habe ich es mir auch gedacht. Das Problem liegt darin, in dieser Abfrage noch die Spalte "klimastufe" hinzuzufügen. Zum Beispiel so: (Die Syntax ist natürlich jetzt inakzeptabel)

Code:
ALTER TABLE tab_1 ADD COLUMN wasserstufe INT, klimastufe INT
 
UPDATE    tab_1
SET        tab_1.wasserstufe = (    SELECT    tab_2.wert
                                FROM    tab_2
                                WHERE    tab_2.rid = tab_1.id
                                AND        tab_2.wert LIKE '%7%'
                                AND        ST_Intersects(AsText(tab_1.the_geom), ('POLYGON ((...))')) )
 
AND SET    tab_1.klimastufe = (SELECT    tab_2.wert
                                FROM    tab_2
                                WHERE    tab_2.rid = tab_1.id
                                AND        tab_2.wert LIKE '%6%'
                                AND        ST_Intersects(AsText(tab_1.the_geom), ('POLYGON ((...))')) )
 

ukulele

Datenbank-Guru
Beiträge
4.770
Ich hätte es jetzt in 2 Schritten gemacht, aber das ist ansich egal. Die Syntax ist einfach:

Code:
ALTER TABLE tab_1 ADD COLUMN wasserstufe INT;
ALTER TABLE tab_1 ADD COLUMN klimastufe INT;
 
UPDATE    tab_1
SET        tab_1.wasserstufe = (    SELECT    tab_2.wert
                                FROM    tab_2
                                WHERE    tab_2.rid = tab_1.id
                                AND        tab_2.wert LIKE '%7%'
                                AND        ST_Intersects(AsText(tab_1.the_geom), ('POLYGON ((...))')) ),
        tab_1.klimastufe = (    SELECT    tab_2.wert
                                FROM    tab_2
                                WHERE    tab_2.rid = tab_1.id
                                AND        tab_2.wert LIKE '%6%'
                                AND        ST_Intersects(AsText(tab_1.the_geom), ('POLYGON ((...))')) )
 

MarcoPolo

Neuer Benutzer
Beiträge
4
Folgende Fehlermeldung entsteht:

"more than one row returned by a subquery used as an expression"
Dieser Fehler tritt bei Anweisungen auf, bei denen die Unterabfrage mehr als einen Datensatz zurückgibt. Die Unterabfrage ist die eingebaute "SELECT-Abfrage". Das funktioniert so leider nicht..
 

ukulele

Datenbank-Guru
Beiträge
4.770
Du musst den zu setzenden Wert für jede Zeile ermitteln und die Unterabfrage muss natürlich eindeutig sein. Wenn in deiner tab_2 mehr als ein Wert für Wasserstufe zu deinem Datensatz in tab_1 zugeordnet ist musst du dich entscheiden, welchen du wählst. Ich hatte dich aber am Anfang so verstanden, das es immer nur 2 Werte gibt, Wasser- und Klimastufe.
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
10.013
Hallo!
Ich würde gerne aus einer Spalte gezielt die werte trennen und abbilden.

Eine tab_1 und eine tab_2 ist gegeben.

Sie stehen folgendermaßen in Beziehung:

tab_1.id = tab_2.rid

Die Tabellen stehen in einer 1 zu N Beziehung zueinander. Das heißt während bei tab_1 die id = "1" einmal vorkommt, wird die rid = "1" zweimal vorkommen.

Jetzt möchte ich ganz gerne die Spalte in tab_2(tab_2.werte) in zwei Spalten aufteilen. Die Werte ,it 6100,6200,... sollen in der Spalte tab_2.klimastufe angezeigt werden.
Die Werte mit 7100,7200,... sollen in einer Spalte tab_2.wasserstufe angezeigt werden.

Ich hoffe das ist verständlich.. ansonsten im Folgenden einmal 2 Abfragen, um beide Spalten einzelnt anzeigen zu lassen: (ich brauche die Anzeige beider Spalten gleichzeitig)

Ist das Thema noch aktuell?

Falls ja: Du kannst Deine tab_2 ja erst einmal von:

Code:
test=*# select * from tab2;
 id | wert
----+------
  1 |   10
  1 |   20
  1 |   30
  2 |   30
  2 |   20
  2 |   10
(6 rows)


Angenommen, alles was kleiner gleich 20 ist soll in einer Spalte und alles größer 20 in einer anderen Spalte angezeigt werden. Da ist schon das erste Problem: Du hast unterschiedliche Mengen für diese Bedingung. Mal ganz einfach:

Code:
test=*# select a.id, a.wert as new_col1, b.wert as new_col2 from (select * from tab2 where wert <= 20) a left join (select * from tab2 where wert > 20) b on a.id=b.id;;
 id | new_col1 | new_col2
----+----------+----------
  1 |       10 |       30
  1 |       20 |       30
  2 |       20 |       30
  2 |       10 |       30
(4 rows)

Ob das nun noch mit der Realität Deiner Daten übereinstimmt weiß ich nicht.


Diese Tabelle kannst Du nun ganz einfach zu Deiner tab_1 joinen, daß muß ich ja jetzt nicht zeigen.


Falls das jetzt völlig nutzlos war: zeige uns einfach eine Demo mit einigen wenigen Daten, und das, was bei rauskommen soll.


Andreas
 
Oben