Announcement

Collapse
No announcement yet.

Array als WHERE Bedingung in SQL

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

  • Array als WHERE Bedingung in SQL

    Hallo,
    ich weiß jetzt selber nicht, ob ich in diesem Forum 100% richtig bin bei meiner Frage, aber ich stell sie jetzt einfach mal.

    Ich habe ein ASP.NET Programm was einen Datenbank-Connect zu einer Oracle Datenbank herstellt.

    Bei meinem Datenbank-Connect stelle ich eine select Abfrage, die diesem Beispiel ähnelt.

    Select * from TABLE1 where ID=1 OR ID=2 OR ID=10 OR ID=17 ...

    also ganz viele OR's miteinander verknüpft (die ID's ermittel ich davor im Programm).

    mein Problem ist jetzt, dass ich mir zwar das Select sehr schön generieren lassen kann, allerdings ab einer bestimmten Anzahl von ID's das Select Statement anscheinend zu lange ist und deswegen ein Fehler zustande kommt.

    Jetzt habe ich mir gedacht, wäre es am besten, wenn ich mein Array (in dem alle ID's für die Abfrage gespeichert sind) als where Bedingung einfügen könnte, also z. B.

    Select * from TABLE1 where ID=mein_Array()

    Geht das überhaupt in SQL? Falls nicht, gibt es eine andere Lösung für mein Problem.

    Danke für die Antworten.

    mfg stash

  • #2
    Oracle sollte auch den IN Syntax beherrschen also

    [Highlight=SQL]Select * from TABLE1 where ID in (1,2,10,17,....)[/Highlight]

    Aber auch dort wird die Liste der Werte bzw. der gesamte SQL String eine Längenbegrenzung haben. Da das ein explizites Datenbankproblem ist solltest du die Frage eher im Oracle Bereich selbst stellen.
    Zuletzt editiert von Ralf Jansen; 18.01.2010, 13:11.

    Comment


    • #3
      Hallo,
      danke für die Antwort.

      Das mit dem IN hatte ich bereits auch schon ausprobiert. Leider ist da aber ab 1000 Einträgen schluss.

      Mit OR habe ich so um die 3000 Einträge hinbekommen.

      Allerdings habe ich teilweise bis zu 10000 ID's.

      Gruß

      Comment


      • #4
        Dann dürfte sich eine temporäre Tabelle anbieten - egal wie es unter Oracle möglich ist.

        Jürgen

        PS. Ich verschiebe die Diskussion nach Oracle, weil es wirklich nichts mit ASP.NET zu tun hat.

        Comment


        • #5
          Woher hast Du denn diese IDs? Wenn Du die schon aus einer Datenbank hast, dann kannst Du sie ja direkt mit der anderen Tabelle joinen.
          Eine Usereingabe wirds kaum sein... der klickt wohl keine 10000 IDs an *g* Oder kommen die aus einer Datei?

          Wenn Du sie aufgrund irgendwelcher Kriterien aus der Datenbank filterst würde ich Dir empfehlen die Abfragelogik in SQL zu implementieren (wenn möglich). Dann müsste man den Umweg über Dein Programm nicht gehen.

          Comment


          • #6
            der klickt wohl keine 10000 IDs an
            Nööö, er tippt die ein.....
            Christian

            Comment


            • #7
              hallo,
              danke für die antworten.

              die 10000 id's stammen aus meinem programm (asp.net). wie diese jetzt genau zustande kommen ist ja egal, schlussendlich habe ich in meinem asp.net programm 5000 bis 10000 id's in einem array gespeichert und bisher hatte ich es halt so gelöst, dass eine select abfrage mit OR gebildet wurde und diese mit HIlfe einer "SqlDataSource" (ASP.NET Komponente zum Einbinden von Datenbanken) an Oracle weitergegeben wurde.

              Gibt es da noch irgendwelche Möglichkeiten dass zu realisieren?

              Danke für die Antworten

              Comment


              • #8
                Hi,

                wie schon vorgeschlagen, würde ich diese IDs in eine Global Temporary Table laden und dann per Join darauf zugreifen.

                Das sollte die einfachste und schnellste Möglichkeit sein.

                Dim
                Zitat Tom Kyte:
                I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

                Comment


                • #9
                  hallo,
                  erstmal danke für die idee mit der temporary table. die ist nicht schlecht, die hab ich auch gleich mal ausprobiert.

                  problem dabei ist nur, dass mein programm (asp.net) ziemlich lange braucht, bis mal 10000 id's in die temporäre tabelle eingefügt wurden. der inner join bei der abfrage klappt dann wunderbar, allerdings dauert das einfügen der id's sehr lange, was nicht von Vorteil ist.

                  Deswegen war ja meine Frage, ob ich irgendwie das Array, welches mir schon in meinem Programm vorliegt und alle ID's beinhaltet, in meine select abfrage integrieren kann als where Bedingung.

                  Für weitere Vorschläge wäre ich sehr dankbar.

                  mfg

                  Comment


                  • #10
                    SQL hat nichts mit einer Programmiersprache zu tun. Aus diesem Grunde kann auch ein Array nicht in SQL eingefügt werden.

                    Ab einer gewissen Größe benötigen DB-Operationen nun mal Zeit. Dies kann man u.U. hardwareseitig auffangen oder Optimierungen im Konzept vornehmen:

                    - Können die IDs schon zu einem anderen Zeitpunkt erzeugt werden?
                    - Kann das Erzeugen beschleunigt werden durch die Nutzung von Threads?
                    - Muss ggf. das DB-Modell umgestellt werden um die gewünschte Abfrage ohne die IDs performanter hin zu kriegen?
                    ....
                    Christian

                    Comment


                    • #11
                      problem dabei ist nur, dass mein programm (asp.net) ziemlich lange braucht, bis mal 10000 id's in die temporäre tabelle eingefügt wurden.
                      Wie fügst Du die Datein ein? Verwendest Du PreparedStatements und Bindvariablen? Das hat eine sehr große Auswirkung auf die Laufzeit.
                      Zusätzlich bietet z.B. der JDBC Treiber Batchverarbeitung an, bei der mehrere Insert Statements in einem Rusch abgeschickt werden können. Wenn Du den Oracle Treiber verwendest sollte das auch bei dir gehen.
                      Dann kannst Du z.B. immer 100 Inserts (nicht alle 10000 auf einmal bitte )in einem abschicken und spartst dir damit unnötige Netzwerk Roundtrips.

                      Dim
                      Zitat Tom Kyte:
                      I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

                      Comment

                      Working...
                      X