+ Antworten
Seite 1 von 2 1 2 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Kein Ergebnis bei Abfrage mit Unterabfragen

  1. #1
    elephant ist offline Neuer Benutzer
    Registriert seit
    17.09.2009
    Beiträge
    9

    Standard Kein Ergebnis bei Abfrage mit Unterabfragen

    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:
    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!

  2. #2
    akretschmer ist offline Erfahrener Benutzer
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    4.480

    Standard

    Zitat Zitat von elephant Beitrag anzeigen
    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:
    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:
    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
    --
    Papa-Kind-Kur vom 8. bis 29. September ;-)
    PostgreSQL Hosting
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    http://www.amazon.de/gp/registry/2APKFICAIYMWB
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    elephant ist offline Neuer Benutzer
    Registriert seit
    17.09.2009
    Beiträge
    9

    Standard

    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!

    Zitat Zitat von akretschmer Beitrag anzeigen
    Liegt wohl an Deiner WHERE-Condition. Kurzer Nachbau:

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

    Andreas

  4. #4
    akretschmer ist offline Erfahrener Benutzer
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    4.480

    Standard

    Zitat Zitat von elephant Beitrag anzeigen
    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:
    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:
    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:
    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
    --
    Papa-Kind-Kur vom 8. bis 29. September ;-)
    PostgreSQL Hosting
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    http://www.amazon.de/gp/registry/2APKFICAIYMWB
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    ads
    ads ist offline Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    3.411

    Ausrufezeichen

    Zitat Zitat von akretschmer Beitrag anzeigen
    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

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

    PostgreSQL Service & Support

  6. #6
    akretschmer ist offline Erfahrener Benutzer
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    4.480

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    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
    --
    Papa-Kind-Kur vom 8. bis 29. September ;-)
    PostgreSQL Hosting
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    http://www.amazon.de/gp/registry/2APKFICAIYMWB
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    akretschmer ist offline Erfahrener Benutzer
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    4.480

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    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
    --
    Papa-Kind-Kur vom 8. bis 29. September ;-)
    PostgreSQL Hosting
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    http://www.amazon.de/gp/registry/2APKFICAIYMWB
    https://www.xing.com/profile/Andreas_Kretschmer7

  8. #8
    Avatar von Xandrian
    Xandrian ist offline Administrator
    Registriert seit
    23.11.2005
    Ort
    Bayreuth, Bayern, Germany, 106332342737801, Bayreuth, Germany
    Beiträge
    1.281

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    Hab ich nicht, also meine FAQ mal bitte an die richtige Stelle verschieben.
    erledischt...
    pg-forum.de unterstützen? Meine Wunschliste


  9. #9
    elephant ist offline Neuer Benutzer
    Registriert seit
    17.09.2009
    Beiträge
    9

    Standard

    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:
     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:
    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!



    Zitat Zitat von akretschmer Beitrag anzeigen
    Deine Tabelle dcmtag enthält ja, vereinfacht, dies:

    Code:
    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:
    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:
    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

  10. #10
    akretschmer ist offline Erfahrener Benutzer
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    4.480

    Standard

    Zitat Zitat von elephant Beitrag anzeigen
    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-gestel...u-spalten.html

    Andreas
    --
    Papa-Kind-Kur vom 8. bis 29. September ;-)
    PostgreSQL Hosting
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    http://www.amazon.de/gp/registry/2APKFICAIYMWB
    https://www.xing.com/profile/Andreas_Kretschmer7

+ Antworten
Seite 1 von 2 1 2 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum