Announcement

Collapse
No announcement yet.

DISTINCT in XMLQuery

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DISTINCT in XMLQuery

    Hey! Ich hab mal wieder ein kleines Problem
    Und zwar lasse ich mir mit einer XMLQuery XML-Daten generieren, das funktioniert soweit auch prima, nur leider bekomme ich doppelte Werte.
    Ich habe versucht diese mit einem DISTINCT zu eliminieren, nur leider bisher ohne Erfolg
    Das ist mein Statement:
    Code:
    select XMLElement
    ("Table1",
    XMLElement
    ("Table1_ITEM", XMLForest(--elements--) )
    ,
    XMLElement
    ("Table2",
    XMLAgg ( XMLElement
    ( "Table2_ITEM", XMLForest(--elements--) )
    )
    ,
    XMLElement
    ("Table3",
    XMLAgg
    (XMLElement
    ("Table3_ITEM", XMLForest(--elements--) )
    )
    )
    ))).getClobVal() AS XML
    
    FROM Table1, Table2, Table3
    WHERE Table1.ID = Table2.ID AND Table2.ID = Table3.ID
    AND Table1.ID = 9439
    
    GROUP BY --table1 elements--
    Wenn ichs nun am Anfang mit SELECT DISTINCT XMLElement("Table1", ... mache, bekomme ich allerdings einen ORA-22950: cannot ORDER objects without MAP or ORDER method-Fehler.

    Hat jemand eine Idee wie ich die doppelten Werte eliminieren kann?
    Die doppelten Werte können in Table2 und Table3 auftreten...

    Bin für jeden Lösungsansatz dankbar
    Gruß
    bang

  • #2
    Habs jetzt auch mit einem Inline View versucht, also als FROM-Klausel:
    Code:
      FROM table1,
      (select distinct * from table2) ab, 
     (select distinct * from table3) a
      WHERE table1.ID = 9439 
      AND table1.ID = ab.ID 
      AND ab.ID = a.ID
    Nur bringt das leider gar nichts. Hat jemand ne Idee was ich hierbei falsch mache?

    Comment


    • #3
      Wozu noch ein distinct, wenn du schon nach der einzigen Spalte gruppiert hast, die überhaupt unterschiedliche Daten bringen kann!?

      Code:
      select XMLElement("Table1",XMLElement("Table1_ITEM", XMLForest(Table1_ITEM)),
             XMLElement("Table2",XMLAgg(XMLElement( "Table2_ITEM", XMLForest(Table2_ITEM) )),
             XMLElement("Table3",XMLAgg(XMLElement("Table3_ITEM", XMLForest(Table3_ITEM) ))))) AS XML
        FROM Table1, Table2, Table3
       WHERE Table1.ID = Table2.ID AND Table2.ID = Table3.ID
         AND Table1.ID = 9439
       group by Table1_item
      Wenn was schief gehen kann, dann geht es auch schief bzw. wenn man sich einen Fehler nicht erklären kann und dem nicht auf den Grund geht, hat das immer schlimme Folgen.

      Comment


      • #4
        Guten Morgen!

        Table1 hat unterschiedliche Daten, richtig.
        Bei Table2 und Table3 ist es so, dass Daten doppelt auftreten können.
        Also zum Beispiel:

        Table2 hat zur ID 943 vier Werte in der Spalte ID_NAME.
        Code:
        Table2: ID   ID_NAME
                943     4585
                        4589
                        4587
                        8553
        Table3 hat zur ID 943 und zu ID_NAME 4585 drei Einträge.
        Wenn ich nun mein XMLQuery-Statement verwende, bekomme ich nun alle Einträge der Table3 zurückgeliefert (passend zu ID/ID_NAME); Aber eben auch drei (identische) Einträge für die Table2.
        Und hier würde ja eigentlich 1 zurückgelieferter Eintrag der Table2 ausreichen.....

        Weißt Du was ich meine?
        Ich hoffe ich habe mich trotz akuten Koffeeinmangels verständlich ausgedrückt

        Comment


        • #5
          Bitte mal folgendes ausführen
          Code:
          select Table1.ID, table1_item, table2_item, table3_item
            FROM Table1, Table2, Table3
           WHERE Table1.ID = Table2.ID AND Table2.ID = Table3.ID
             AND Table1.ID = 9439
          Wenn was schief gehen kann, dann geht es auch schief bzw. wenn man sich einen Fehler nicht erklären kann und dem nicht auf den Grund geht, hat das immer schlimme Folgen.

          Comment


          • #6
            tschuldigung, hab eine JOIN-Bedingung vergessen:
            Table2.ID_NAME = Table3.ID_NAME

            Aber ich verstehe jetzt nich ganz was Du mir sagen willst....?
            Wenn ich Dein Statement ausführe, bekomme ich 179 Records zurück, setze ich ein DISTINCT davor sinds nur noch 4.

            nochmal:
            Wenn ich die XMLQuery ausführe bekomme ich:
            1 Record für Table 1
            179 Records für Table 2
            179 Records für Table 3
            -----------
            Mein Wunschergebnis wäre:
            1 Record für Table 1
            4 Records für Table 2
            179 Records für Table 3


            oder steh ich total auf dem Schlauch?

            Comment


            • #7
              Ich wollte eigentlich nur, dass du mir das Ergebnis reinstellst, damit ich ein besseres Verständnis bekomme - sorry. Ich kenne leider die Daten nicht wirklich, aber ein group by der Spalten liefert dasselbe Ergebnis.

              Code:
              select XMLElement("Table1",XMLElement("Table1_ITEM", XMLForest(Table1_ITEM)),
                     XMLElement("Table2",XMLAgg(XMLElement("Table2_ITEM", XMLForest(Table2_ITEM) )),
                     XMLElement("Table3",XMLAgg(XMLElement("Table3_ITEM", XMLForest(Table3_ITEM) ))))) AS XML
                FROM Table1, Table2, Table3
               WHERE Table3.ID = Table2.ID
                 and Table2.ID = Table1.ID 
                 AND Table1.ID = 9439
               group by Table1_item, Table2_item, Table3_item
              Wenn was schief gehen kann, dann geht es auch schief bzw. wenn man sich einen Fehler nicht erklären kann und dem nicht auf den Grund geht, hat das immer schlimme Folgen.

              Comment


              • #8
                achso, sag das doch gleich
                Hier mal ein konkretes Beispiel:
                Table1 = Objects, Table2=Ablauftabellen, Table3=Ablaeufe

                1 Object kann mehrere Ablauftabellen (id_name) besitzen, die wiederum aus mehreren Ablaeufen bestehen (gleicher id_name, aber unterschiedliche daten).

                Die Abfrage
                Code:
                select PADBS_OBJECTS.ID, 
                ABLAUFTABELLEN.ID_NAME, ABLAEUFE.ID_NAME
                
                FROM OBJECTS, ABLAUFTABELLEN,ABLAEUFE
                
                WHERE PADBS_OBJECTS.ID=ABLAUFTABELLEN.ID AND ABLAUFTABELLEN.ID=ABLAEUFE.ID
                AND ABLAUFTABELLEN.ID_NAME=ABLAEUFE.ID_NAME
                AND PADBS_OBJECTS.ID=9439
                liefert folgendes Ergebnis:
                Code:
                ID     ID_NAME(Ablauftabellen)     ID_NAME1(Ablaeufe)
                9439        4585                  4585
                9439        4585                  4585
                9439        4585                  4585
                9439        4587                  4587
                9439        4587                  4587
                etc.pp.
                Also liefert mir die XMLQuery, 3-mal den Ablauftabellendatensatz bei ID_Name=4585, weil dieser ID_Name 3-mal in Ablaeufe steht.
                Obwohl die Ablauftabellendaten immer dieselben sind bei gleichem ID_Name bzw. nur einmal in der Ablauftabellen-Tabellen stehen.

                Ich hätte also gerne nur 1-mal den Ablauftabellendatensatz bei ID_Name=4585 und 3-mal die Daten aus Ablaeufe bei ID_Name=4585.

                Ich hoffe es wird jetzt klarer...
                aber danke für Deine Mühe!

                Comment


                • #9
                  Dummy steht für deine 3 Tabellen

                  Code:
                  select
                     XMLElement("Table1",XMLElement("ID", XMLForest(ID)),
                     XMLElement("Table2",XMLAgg(XMLElement("ITEM2", XMLForest(ITEM1) )),
                     XMLElement("Table3",XMLAgg(XMLElement("ITEM2", XMLForest(ITEM2) ))))) AS XML
                    from (select distinct * from dummy)
                   group by id
                  Wie gefällt dir diese Ausgabe?

                  Code:
                  <Table1>
                    <ID>
                      <ID>9439</ID>
                    </ID>
                    <Table2>
                      <ITEM2>
                        <ITEM1>4585</ITEM1>
                      </ITEM2>
                      <ITEM2>
                        <ITEM1>4587</ITEM1>
                      </ITEM2>
                      <Table3>
                        <ITEM2>
                          <ITEM2>4585</ITEM2>
                        </ITEM2>
                        <ITEM2>
                          <ITEM2>4587</ITEM2>
                        </ITEM2>
                      </Table3>
                    </Table2>
                  </Table1>
                  Wenn was schief gehen kann, dann geht es auch schief bzw. wenn man sich einen Fehler nicht erklären kann und dem nicht auf den Grund geht, hat das immer schlimme Folgen.

                  Comment


                  • #10
                    Wenn ich es so mache:
                    Alternative #1:
                    Code:
                    .....
                    FROM (select distinct * from OBJECTS, ABLAUFTABELLEN,ABLAEUFE)
                    WHERE ...
                    GROUP BY ...
                    Bekomme ich einen ORA-00904: Invalid Identifier - Fehler beim GROUP BY-Statement.

                    Alternative #2:
                    Code:
                    FROM (select distinct * from OBJECTS, ABLAUFTABELLEN,ABLAEUFE
                    WHERE ...
                    )
                    GROUP BY ...
                    Bekomme ich einen ORA-00904: Invalid Identifier - Fehler beim GROUP BY-Statement.

                    Alternative #3:
                    Code:
                    FROM (select distinct * from OBJECTS, ABLAUFTABELLEN,ABLAEUFE)
                    WHERE ...
                    Bekomme ich einen ORA-00904: Invalid Identifier - Fehler beim WHERE-Statement.

                    Alternative #4:
                    Code:
                    FROM (select distinct * from OBJECTS, ABLAUFTABELLEN,ABLAEUFE
                    WHERE ...
                    )
                    Bekomme ich einen ORA-00904: Invalid Identifier - Fehler beim XMLAgg(XMLElement("ITEM3", XMLForest(ITEM3) ))

                    Also immer einen Invalid Identifier der seine Position ändert.
                    Irgendeine Idee was das Problem hier sein könnte?

                    Alternative #5:
                    Das SELECT DISTINCT nur bei (select distinct * from ABLAUFTABELLEN).
                    Mit Alias-Angabe, da es sonst nicht funktioniert:
                    Code:
                    FROM  OBJECTS, (select distinct * from ABLAUFTABELLEN) a, ABLAEUFE
                    WHERE ...
                    Bringt aber leider gar nichts, da das Resultat (die XML-Datei) immer noch doppelte Results aufweist

                    hüüülfe

                    Comment


                    • #11
                      Auweh
                      Ist meine letzte XML-Ausgabe, s. oben, in Ordnung – ja oder nein?????
                      Wenn was schief gehen kann, dann geht es auch schief bzw. wenn man sich einen Fehler nicht erklären kann und dem nicht auf den Grund geht, hat das immer schlimme Folgen.

                      Comment


                      • #12
                        Prinzipiell ist sie es, hab sie an paar Stellen ergänzt/verändert.
                        (ITEM1, ITEM3) (in Table3, mehrfach ID_NAME)

                        Code:
                        <Table1>
                          <Item1>
                            <ID>9439</ID>
                          </Item1>
                          <Table2>
                            <ITEM2>
                              <ID_NAME>4585</ID_NAME>
                            </ITEM2>
                            <ITEM2>
                              <ID_NAME>4587</ID_NAME>
                            </ITEM2>
                            <Table3>
                              <ITEM3>
                                <ID_NAME>4585</ID_NAME>
                              </ITEM3>
                              <ITEM3>
                                <ID_NAME>4585</ID_NAME>
                              </ITEM3>
                              <ITEM3>
                                <ID_NAME>4585</ID_NAME>
                              </ITEM3>
                              <ITEM3>
                                <ID_NAME>4587</ID_NAME>
                              </ITEM3>
                              <ITEM3>
                                <ID_NAME>4587</ID_NAME>
                              </ITEM3>
                            </Table3>
                          </Table2>
                        </Table1>
                        So sollte die Ausgabe aussehen. Also fast richtig gemacht

                        Code:
                        select
                           XMLElement("Table1",XMLElement("ITEM1", XMLForest(ID)),
                           XMLElement("Table2",XMLAgg(XMLElement("ITEM2", XMLForest(ID_NAME) )),
                           XMLElement("Table3",XMLAgg(XMLElement("ITEM3", XMLForest(ID_NAME) ))))) AS XML
                          from (select distinct * from dummy)
                         group by id

                        Comment


                        • #13
                          Ich meinte viel mehr so...

                          Code:
                          select
                             XMLElement("Table1",XMLElement("ITEM1", XMLForest(ID)),
                             XMLElement("Table2",XMLAgg(XMLElement("ITEM2", XMLForest(ID_NAME2) )),
                             XMLElement("Table3",XMLAgg(XMLElement("ITEM3", XMLForest(ID_NAME3) ))))) AS XML
                            from (select distinct a.id, b.id_name id_name2, c.id_name id_name3
                                    from table1 a
                                         join table2 b on (b.id = a.id)
                                         join table3 c on (c.id = b.id))
                           group by id
                          Wenn was schief gehen kann, dann geht es auch schief bzw. wenn man sich einen Fehler nicht erklären kann und dem nicht auf den Grund geht, hat das immer schlimme Folgen.

                          Comment


                          • #14
                            Mahlzeit!

                            Habs gerade eben getestet.
                            Ich bekomme leider einen ORA-00904: Invalid Identifier-Fehler im XMLForest-Statment
                            obwohl ichs genauso mit Alias gemacht habe wie du....

                            Comment


                            • #15
                              Im Sql*Plus?
                              Wenn was schief gehen kann, dann geht es auch schief bzw. wenn man sich einen Fehler nicht erklären kann und dem nicht auf den Grund geht, hat das immer schlimme Folgen.

                              Comment

                              Working...
                              X