Hallo,
vielleicht kann mir bitte jemand weiterhelfen. Ich möchte aus einer Tabelle einzelne Zeilen als Spalte darstellen lassen und bastele mir folgende SQL-Anweisung mit Java zusammen.
Die Abfrage funktioniert einwandfrei, wenn alle Unterabfragen Ergebnisse zurückliefern. Liefert aber eine Unterabfrage kein Ergebnis, bekomme ich über die ganze Abfrage auch kein Ergebniszeilen. Hat jemand eine Idee, wie ich das Ergebnis der anderen Unterabfragen trotzdem ausgeben kann???Code:SELECT "0002,0000", "0008,0020", "0008,0021" FROM (SELECT value AS "0002,0000", sopinstanceuid FROM dcmtag WHERE tag = '0002,0000' AND sopinstanceuid IN ('1.3.51.0.7.2545223877.51878.5447.48939.44644.10011.28045', ...)) AS "tagtable0002,0000", (SELECT value AS "0008,0020", sopinstanceuid FROM dcmtag WHERE tag = '0008,0020' AND sopinstanceuid IN ('1.3.51.0.7.2545223877.51878.5447.48939.44644.10011.28045', ...)) AS "tagtable0008,0020", (SELECT value AS "0008,0021", sopinstanceuid FROM dcmtag WHERE tag = '0008,0021' AND sopinstanceuid IN ('1.3.51.0.7.2545223877.51878.5447.48939.44644.10011.28045', ...)) AS "tagtable0008,0021", WHERE "tagtable0002,0000".sopinstanceuid = "tagtable0008,0020".sopinstanceuid AND "tagtable0008,0020".sopinstanceuid = "tagtable0008,0021".sopinstanceuid
Schon mal Danke für jede Hilfe!
Liegt wohl an Deiner WHERE-Condition. Kurzer Nachbau:
Wie man aus Zeilen Spalten machen kann habe ich diese Woche, glaube ich, schon 2 mal hier gezeigt. Und wir haben erst Mittwoch ...Code:test=# select * from (select 'a', 1 as "eins" union select 'b', 2) bla1, (select 'a', null as "zwei" union select 'b', 2) bla2; ?column? | eins | ?column? | zwei ----------+------+----------+------ a | 1 | a | a | 1 | b | 2 b | 2 | a | b | 2 | b | 2 (4 Zeilen) Zeit: 0,369 ms test=*# select * from (select 'a', 1 as "eins" union select 'b', 2) bla1, (select 'a', null as "zwei" union select 'b', 2) bla2 where eins = zwei; ?column? | eins | ?column? | zwei ----------+------+----------+------ b | 2 | b | 2 (1 Zeile) Zeit: 20,770 ms test=*# select * from (select 'a', 1 as "eins" union select 'b', 1) bla1, (select 'a', null as "zwei" union select 'b', 2) bla2 where eins = zwei; ?column? | eins | ?column? | zwei ----------+------+----------+------ (0 Zeilen)
Andreas
--
PostgreSQL Hosting
http://www.amazon.de/gp/registry/2APKFICAIYMWBads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
https://www.xing.com/profile/Andreas_Kretschmer7
Hallo,
versteh ich leider trotzdem nicht und die anderen Beiträge, die um das gleiche Thema gehen sollen find ich auch nicht ...
An welcher WHERE-Condition soll dass denn liegen? Versteh das nicht! Sobald ich bei jeder Unterabfrage eine Ergebnismenge bekomm, funktioniert das ja wunderbar ...!
Kannst du mir bitte nochmals Nachhilfe geben und ggfs. die betreffenden Beiträge zeigen?
Danke!
Deine Tabelle dcmtag enthält ja, vereinfacht, dies:
Wenn ich in Deine Abfrage so darauf anwende, aber aus der ersten Zeile ein "select *" mache und die letzten 2 Zeilen weglasse (also bei Dir diese Zeilen:Code:test=*# select * from elephant ; value | id -------+---- 100 | 1 200 | 2 300 | 3 400 | 4 (4 Zeilen)
WHERE "tagtable0002,0000".sopinstanceuid = "tagtable0008,0020".sopinstanceuid
AND "tagtable0008,0020".sopinstanceuid = "tagtable0008,0021".sopinstanceuid
dann erhalte ich ich dies:
Was würde denn Deine Abfrage, nach meinem Schema verändert, bringen? Laß mich raten: eine der "sopinstanceuid" - Spalten enthält NULL, und Du hättest (vermutlich) mehrere Zeilen.Code:test=*# select * from (select value as col1, id from elephant where id=1) as tab1, (select value as col2, id from elephant where id=2) as tab2, (select value as col3, id from elephant where id=3) as tab3; col1 | id | col2 | id | col3 | id ------+----+------+----+------+---- 100 | 1 | 200 | 2 | 300 | 3 (1 Zeile)
Lösung:
Und so eine Geschichte mit CASE WHEN ... ELSE ... END habe ich schon nun zum 3. Mal diese Woche gezeigt.Code:test=*# select sum(case when id=1 then value else NULL end) as col1, sum(case when id=2 then value else NULL end) as col2, sum(case when id=5 then value else NULL end) as col5 from elephant; col1 | col2 | col5 ------+------+------ 100 | 200 | (1 Zeile)
Andreas
--
PostgreSQL Hosting
http://www.amazon.de/gp/registry/2APKFICAIYMWBads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
https://www.xing.com/profile/Andreas_Kretschmer7
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
--
PostgreSQL Hosting
http://www.amazon.de/gp/registry/2APKFICAIYMWBads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
https://www.xing.com/profile/Andreas_Kretschmer7
--
PostgreSQL Hosting
http://www.amazon.de/gp/registry/2APKFICAIYMWBads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
https://www.xing.com/profile/Andreas_Kretschmer7
Hallo,
das hab ich verstanden! Aber ich kann die Lösung nicht auf mein Problem anwenden. Die Tabellenstruktur sieht stark vereinfacht wie folgt aus:
Die sopinstanceuid fasst sozusagen die tags mit value zu einer logischen Einheit zusammen. Man könnte zwar bei diesem einfachen Beispiel auf die Idee kommen, daraus zwei Tabellen zu machen, praktisch ist aber das unmöglich ...Code:sopinstanceuid | tag | value ----------------+-------------+------ 123 | 0008,0008 | test1 123 | 0008,0021 | test2 123 | 0010,0010 | test3 123 | 0018,0090 | test4 456 | 0008,0008 | test11 456 | 0008,0021 | test22 456 | 0010,0010 | test33 789 | 0008,0008 | test111 789 | 0008,0021 | test222 789 | 0010,0010 | test333 789 | 0018,0090 | test444
Man beachte, dass bei sopinstanceuid 456 der tag 0018,0090 fehlt!
Das erwartete Ergbnis sieht dann folgendermaßen aus:
Die WHERE-CLAUSE sorgt dafür, dass die values in einer Zeile stehen. Ansonsten würde das ein cross-Join werden ...Code:0008,0008 | 0008,0021 | 0010,0010 | 0018,0090 ----------+-------------+------------+----------+ test1 | test2 | test3 | test4 test11 | test22 | test33 | test111 | test222 | test333 | test444
Die Abfrage von oben erspar ich mir an dieser Stelle! Wie gesagt funktioniert das einwandfrei, wenn alle Unterabfragen Ergebnisse zurückliefern. Es muss doch eine Möglichkeit geben, trotzdem immer alle Ergebnisse auszugeben, auch wenn eine Unterabfrage nichts zurückgibt!
Schon mal Danke für deine/eure Hilfe!
--
PostgreSQL Hosting
http://www.amazon.de/gp/registry/2APKFICAIYMWBads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
https://www.xing.com/profile/Andreas_Kretschmer7
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen