2017-05-11 12 views
3

Ich habe eine Tabelle von Elementen, durch ihre eindeutige ID identifiziert, zusammen mit einigen Eigenschaften.Wählen Sie mit dem Wert einer Spalte

die Tabelle lesbar zu halten, wird die Eigenschaft immer in der Spalte ‚prop_value‘ gespeichert und seine Art ist in der Spalte ‚prop_type‘

Zur Vereinfachung gespeichert, ich habe nur drei Eigenschaften verwendet habe, in der Tat, gibt es 12.

+----+-------------+-------------+ 
+ ID + prop_type + prop_value + 
+----+-------------+-------------+ 
+ 1 + prop1 + foo  + 
+----+-------------+-------------+ 
+ 1 + prop3 + toto  + 
+----+-------------+-------------+ 
+ 3 + prop2 + lorem  + 
+----+-------------+-------------+ 

Ziel alle Eigenschaften für ein Element in einer sigle Reihe zu bekommen ist, ein Ergebnis, wie zum Beispiel:

+----+-------------+-------------+-------------+ 
+ ID +  prop1 + prop2 +  prop3 + 
+----+-------------+-------------+-------------+ 
+ 1 + foo  + NULL  + toto  + 
+----+-------------+-------------+-------------+ 
+ 2 + NULL  + lorem  + NULL  + 
+----+-------------+-------------+-------------+ 

Am Anfang habe ich eine sehr hässliche Lösung:

select prop1 from myTable where id = 1 
select prop2 from myTable where id = 1 
... 

Nun, da ich dies bis an Skalierung, es nimmt immer, und ich möchte es in einer Abfrage machen.

Ich habe so etwas wie versucht:

select a.prop_value, b.prop_value, c.prop_value from myTable a FULL JOIN myTable b FULL JOIN myTable c ... 

Aber es fühlt sich an wie ich werde mich in etwas Art und Weise komplizierter, als es sein muss.

Gibt es eine kompakte Lösung, um dies zu erreichen? Danke für Ihre Hilfe.

+0

Geben Sie bitte immer Ihre Oracle-Version (wie 11.1, 11.2, etc.) - wenn Sie nicht wissen, laufen 'select * from v $ version'. Das ist in den meisten Fällen wichtig. In diesem Fall: Wenn Ihre Version 11.1 oder höher ist, können Sie den Operator "pivot" verwenden. In früheren Versionen kann man immer "manuell" schwenken, Ollie hat das schon in seiner/ihrer Antwort gezeigt. – mathguy

+0

Es ist noch komplizierter als das, es ist eine benutzerdefinierte Integration einer Oracle-Datenbank von einem Industrie-Software-Anbieter (AspenTech's SQLPlus) – Maxime

Antwort

1

Sie können etwas bedingte Logik, wie eine CASE Erklärung, zusammen mit einer Aggregatfunktion verwenden, um das Ergebnis zu erhalten:

select Id, 
    max(case when prop_type = 'prop1' then prop_value end) as Prop1, 
    max(case when prop_type = 'prop2' then prop_value end) as Prop2, 
    max(case when prop_type = 'prop3' then prop_value end) as Prop3 
from myTable 
group by Id; 

Diese Art der Abfrage schwenkt die Zeilenwerte in Spalten.

3

Verwenden Sie ein PIVOT:

SELECT * 
FROM your_table 
PIVOT (MAX(prop_value) FOR prop_type IN (
    'prop1' AS prop1, 
    'prop2' AS prop2, 
    'prop3' AS prop3 
)) 
Verwandte Themen