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

SELECT um Spalten in Zeilen auszugeben

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von gandrim, 29 März 2016.

  1. gandrim

    gandrim Benutzer

    Hallo zusammen,

    ich bin neu hier befasse mich mittlerweile aber seid 2 Jahren mit mysql bei uns in der Firma.

    Jetzt bin ich an einem Punkt an dem ich keine Idee mehr habe. Es geht um folgendes.

    Ich habe eine Tabelle mit einer ID und dann die Spalten 1, 2 und 3.

    id | 1 | 2 | 3
    001| a | b | c

    Gibt es eine Möglichkeit als Ergebnis eine Tabelle auszugeben die pro Spalte eine neue Zeile ausgibt. Also so:
    id | spalte | spaltenwert
    001| 1 | a
    001| 2 | b
    001| 3 | c

    Ich hoffe die Frage ist klar geworden.

    Und ich hoffe das sowas möglich ist.

    Vielen Dank für eure Hilfe.

    Viele Grüße

    Franz
     
  2. ukulele

    ukulele Datenbank-Guru

    Code:
    SELECT id,1 AS spalte,spalte1 AS spaltenwert FROM tabelle UNION ALL
    SELECT id,2 AS spalte,spalte2 AS spaltenwert FROM tabelle UNION ALL
    SELECT id,3 AS spalte,spalte3 AS spaltenwert FROM tabelle
    ...müsste das tun was du suchst.
     
  3. gandrim

    gandrim Benutzer

    Ja klappt super.

    Ich hätte es nur nicht an unserer größten Tabelle ohne Limit testen sollen... ;)

    Aber läuft.

    Vielen Dank.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Ja, Du bekommst halt nun 3 (Anzahl der Spalten) komplette Full-Table-Scans. Je nachdem was Du vorhast solltest Du prüfen, ob Du das wirklich willst.
     
  5. gandrim

    gandrim Benutzer

    Du meinst wenn das mehrere Spalten werden, kann die Abfrage länger dauern?
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Ja. Sieht man, wenn man sich das SQL anschaut. Oder?

    Die Art der Fragestellung läßt mich vermuten, daß das Tabellendesign für's Klo ist.
     
  7. gandrim

    gandrim Benutzer

    Ja kann sein dass du damit recht hast. Aber ich kann mit Hilfe von Where die Abfragen von vorne herein klein halten.

    Das Tabellendesign passt an sich auf unsere Anforderungen die wir haben. Jetzt will aber eine externe Stelle eine Datenschnittstelle per CSV die anderes ist, als das was unsere anderen Kunden etc. bisher gefordert haben. Dadurch die Frage. Aber solange dass nur den einen betrifft, fange ich nicht an unsere komplette Struktur zu kippen und wenn die Abfrage halt ein paar Sekunden mehr braucht auch nicht schlimm, die wird ja nur einmal pro Woche benötigt....
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Dann ist ja gut. Ich wollt nur potenzielle Probleme aufzeigen.
     
  9. gandrim

    gandrim Benutzer

    Ja habe ich auch so verstanden. Danke für den Hinweis :)
     
    akretschmer gefällt das.
  10. akretschmer

    akretschmer Datenbank-Guru

    Man könnte das Performance-Problem auch einigermaßen lösen, wenn man es schafft, nur einen Durchlauf zu benötigen - egal, wie viele Spalten die Tabelle hat. Hier meine Idee mit PostgreSQL und einer Stored Procedure in pl/pgsql:

    Code:
    test=# select * from gandrim; 
    id | c1 | c2 | c3
    ----+----+----+----
      1 | a  | b  | c
      2 | d  | e  | f
      3 | x  | y  | z
    (3 rows)
    
    test=*# create type gandrim_return as (id int, key text, val text);CREATE TYPE
    test=*# create or replace function bla() returns setof gandrim_return as $$declare r record; r2 gandrim_return%rowtype; begin for r in select * from gandrim loop r2.id=r.id; r2.key='c1'; r2.val=r.c1; return next r2; r2.key='c2'; r2.val=r.c2;return next r2; r2.key='c3';r2.val=r.c3; return next r2; end loop; end $$language plpgsql;
    CREATE FUNCTION
    test=*# select * from bla(); 
    id | key | val
    ----+-----+-----
      1 | c1  | a
      1 | c2  | b
      1 | c3  | c
      2 | c1  | d
      2 | c2  | e
      2 | c3  | f
      3 | c1  | x
      3 | c2  | y
      3 | c3  | z
    (9 rows)
    
     
  11. ukulele

    ukulele Datenbank-Guru

    Ich bin icht so erfarhen in Performance-Dingen aber wäre es auch schonender mit WITH das SELECT auszuführen und dann 3 SELECTs auf die Tabelle im WITH zu machen?

    Nicht das MySQL das könnte...
     
  12. akretschmer

    akretschmer Datenbank-Guru

    Nein. Erstens kann MySQL das nicht, und es wird sau-teuer:

    Code:
    test=*# select * from foo;
     i | c1 | c2 | c3
    ---+----+----+----
    (0 rows)
    
    test=*# explain with x1 as (select i, 'c1'::text, c1 from foo), x2 as (select i, 'c2'::text, c2 from foo), x3 as (select i, 'c3'::text,c3 from foo) select * from x1 union all select * from x2 union all select * from x3;
      QUERY PLAN   
    ---------------------------------------------------------------------
     Append  (cost=85.50..196.50 rows=5550 width=40)
      CTE x1
      ->  Seq Scan on foo  (cost=0.00..28.50 rows=1850 width=8)
      CTE x2
      ->  Seq Scan on foo foo_1  (cost=0.00..28.50 rows=1850 width=8)
      CTE x3
      ->  Seq Scan on foo foo_2  (cost=0.00..28.50 rows=1850 width=8)
      ->  CTE Scan on x1  (cost=0.00..37.00 rows=1850 width=40)
      ->  CTE Scan on x2  (cost=0.00..37.00 rows=1850 width=40)
      ->  CTE Scan on x3  (cost=0.00..37.00 rows=1850 width=40)
    (10 rows)
    
     
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