Kein Ergebnis bei Abfrage mit Unterabfragen

Fragen und Probleme rund um die Abfragespache SQL.
elephant
Neuer Benutzer
Beiträge: 9
Registriert: Do 17. Sep 2009, 20:55

Kein Ergebnis bei Abfrage mit Unterabfragen

Beitrag von elephant » Mi 9. Dez 2009, 19:19

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.

Code: Alles auswählen

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
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???

Schon mal Danke für jede Hilfe!

akretschmer
Erfahrener Benutzer
Beiträge: 7565
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitrag von akretschmer » Mi 9. Dez 2009, 19:41

elephant hat geschrieben: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.

Code: Alles auswählen

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
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???

Schon mal Danke für jede Hilfe!


Liegt wohl an Deiner WHERE-Condition. Kurzer Nachbau:

Code: Alles auswählen

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)


Wie man aus Zeilen Spalten machen kann habe ich diese Woche, glaube ich, schon 2 mal hier gezeigt. Und wir haben erst Mittwoch ...

Andreas
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

elephant
Neuer Benutzer
Beiträge: 9
Registriert: Do 17. Sep 2009, 20:55

Beitrag von elephant » Mi 9. Dez 2009, 20:16

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!

akretschmer hat geschrieben:Liegt wohl an Deiner WHERE-Condition. Kurzer Nachbau:

Code: Alles auswählen

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)
Wie man aus Zeilen Spalten machen kann habe ich diese Woche, glaube ich, schon 2 mal hier gezeigt. Und wir haben erst Mittwoch ...

Andreas

akretschmer
Erfahrener Benutzer
Beiträge: 7565
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitrag von akretschmer » Mi 9. Dez 2009, 23:20

elephant hat geschrieben: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:

Code: Alles auswählen

test=*# select * from elephant ;
 value | id
-------+----
   100 |  1
   200 |  2
   300 |  3
   400 |  4
(4 Zeilen)


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:

WHERE "tagtable0002,0000".sopinstanceuid = "tagtable0008,0020".sopinstanceuid
AND "tagtable0008,0020".sopinstanceuid = "tagtable0008,0021".sopinstanceuid


dann erhalte ich ich dies:

Code: Alles auswählen

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)


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.



Lösung:

Code: Alles auswählen

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)


Und so eine Geschichte mit CASE WHEN ... ELSE ... END habe ich schon nun zum 3. Mal diese Woche gezeigt.

Andreas
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

ads
Erfahrener Benutzer
Beiträge: 4148
Registriert: Mi 8. Feb 2006, 10:58
Wohnort: MD
Kontaktdaten:

Beitrag von ads » Mi 9. Dez 2009, 23:52

akretschmer hat geschrieben:habe ich schon nun zum 3. Mal diese Woche gezeigt

Schreib halt endlich mal ein paar FAQ-Einträge, Xandrian freut sich bestimmt!

Dann musst du das nicht immer neu erklären sondern kannst gleich drauf verweisen ;-)
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

PostgreSQL Service & Support

akretschmer
Erfahrener Benutzer
Beiträge: 7565
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitrag von akretschmer » Do 10. Dez 2009, 07:01

ads hat geschrieben:Schreib halt endlich mal ein paar FAQ-Einträge, Xandrian freut sich bestimmt!

Dann musst du das nicht immer neu erklären sondern kannst gleich drauf verweisen ;-)


Ich bin mir gar nicht sicher, dort Schreibrechte zu haben ...


Andreas
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

akretschmer
Erfahrener Benutzer
Beiträge: 7565
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitrag von akretschmer » Do 10. Dez 2009, 09:38

akretschmer hat geschrieben:Ich bin mir gar nicht sicher, dort Schreibrechte zu haben ...


Andreas


Hab ich nicht, also meine FAQ mal bitte an die richtige Stelle verschieben.


Andreas
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Xandrian
Erfahrener Benutzer
Beiträge: 1690
Registriert: Mi 23. Nov 2005, 09:17
Wohnort: Bayreuth
Kontaktdaten:

Beitrag von Xandrian » Do 10. Dez 2009, 09:50

akretschmer hat geschrieben:Hab ich nicht, also meine FAQ mal bitte an die richtige Stelle verschieben.


erledischt...
pg-forum.de unterstützen? Meine Wunschliste

Bild

elephant
Neuer Benutzer
Beiträge: 9
Registriert: Do 17. Sep 2009, 20:55

Beitrag von elephant » Do 10. Dez 2009, 10:51

Hallo,

das hab ich verstanden! Aber ich kann die Lösung nicht auf mein Problem anwenden. Die Tabellenstruktur sieht stark vereinfacht wie folgt aus:

Code: Alles auswählen

 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
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 ...
Man beachte, dass bei sopinstanceuid 456 der tag 0018,0090 fehlt!

Das erwartete Ergbnis sieht dann folgendermaßen aus:

Code: Alles auswählen

0008,0008  |  0008,0021  | 0010,0010  | 0018,0090
 ----------+-------------+------------+----------+
   test1    |    test2   |    test3   |   test4
   test11   |    test22  |    test33  |   
   test111  |    test222 |    test333 |   test444

Die WHERE-CLAUSE sorgt dafür, dass die values in einer Zeile stehen. Ansonsten würde das ein cross-Join werden ...

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!



akretschmer hat geschrieben:Deine Tabelle dcmtag enthält ja, vereinfacht, dies:

Code: Alles auswählen

test=*# select * from elephant ;
 value | id
-------+----
   100 |  1
   200 |  2
   300 |  3
   400 |  4
(4 Zeilen)
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:

WHERE "tagtable0002,0000".sopinstanceuid = "tagtable0008,0020".sopinstanceuid
AND "tagtable0008,0020".sopinstanceuid = "tagtable0008,0021".sopinstanceuid


dann erhalte ich ich dies:

Code: Alles auswählen

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



Lösung:

Code: Alles auswählen

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)
Und so eine Geschichte mit CASE WHEN ... ELSE ... END habe ich schon nun zum 3. Mal diese Woche gezeigt.

Andreas

akretschmer
Erfahrener Benutzer
Beiträge: 7565
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitrag von akretschmer » Do 10. Dez 2009, 10:53

elephant hat geschrieben:Hallo,

das hab ich verstanden! Aber ich kann die Lösung nicht auf mein Problem anwenden. Die Tabellenstruktur sieht stark vereinfacht wie folgt aus:


http://www.pg-forum.de/h-ufig-gestellte-fragen-faq/4067-faq-zeilen-zu-spalten.html

Andreas
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Antworten