SELECT um Spalten in Zeilen auszugeben

gandrim

Benutzer
Beiträge
5
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
 
Werbung:
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.
 
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.
 
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.
 
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....
 
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)
 
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...
 
Werbung:
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)
 
Zurück
Oben