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:
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)
 
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 ((...))')) )
 
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 ((...))')) )
 
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..
 
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:
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
 
Zurück
Oben