Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

pgSQL - Abfrage

Dieses Thema im Forum "PostgreSQL" wurde erstellt von MarcoPolo, 4 September 2012.

  1. MarcoPolo

    MarcoPolo Neuer Benutzer

    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!
     
  2. ukulele

    ukulele Datenbank-Guru

    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)
     
  3. MarcoPolo

    MarcoPolo Neuer Benutzer

    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 ((...))')) )
     
  4. ukulele

    ukulele Datenbank-Guru

    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 und PLSQL_SQL gefällt das.
  5. MarcoPolo

    MarcoPolo Neuer Benutzer

    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..
     
  6. MarcoPolo

    MarcoPolo Neuer Benutzer

    Unterabfragen mit ANY, IN und SOME funzen in dieser Sache leider auch nicht
     
  7. ukulele

    ukulele Datenbank-Guru

    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.
     
  8. akretschmer

    akretschmer Datenbank-Guru

    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
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden