Announcement

Collapse
No announcement yet.

SQL Unterabfragen

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

  • SQL Unterabfragen

    Hi,
    möchte euch vorher mal alle begrüssen und den Admin für die freischaltung danken.

    So jetzt aber zu meinem Problem:

    Code:
    SELECT   pfgj.RUECKMELDE_NR,
               pfgj.RUECKMELDE_POSITIONS_NR POS,
               pfgj.BELEGUNGSEINHEIT_NR BE_NR,
               pfap.ARBEITSGANG_KURZTEXT_1,
               pfap.ARBEITSGANG_KURZTEXT_2,
               pfap.BEZEICHNUNG,
               pfap.AUFTRAGSMENGE,
               pfap.BEARBEITUNGSZEIT SOLL_ZEIT,
               pfap.BEARBEITUNGSZEIT_IST IST_ZEIT,
               pfak.ARTIKEL_NR,
               pfak.BEZEICHNUNG_1
        FROM   pfgj, pfap, pfak
       WHERE       pfgj.RUECKMELDE_NR = pfap.RUECKMELDE_NR
               AND pfap.RUECKMELDE_POSITIONS_NR = pfgj.RUECKMELDE_POSITIONS_NR
               AND pfak.RUECKMELDE_NR = pfap.RUECKMELDE_NR
               AND PFAK.RUECKMELDE_STATUS = 9
               AND pfap.BELEGUNGSEINHEIT_NR IN (15321, 15351)
               AND pfap.APL_ARTENSCHLUESSEL = 10
               AND pfap.ARBEITSPLAN_NR != 'BEST'
               AND pfgj.DATUM_ZEIT between '20090101' and '20090229'
    
    GROUP BY   pfgj.RUECKMELDE_NR,
               pfgj.RUECKMELDE_POSITIONS_NR,
               pfgj.BELEGUNGSEINHEIT_NR,
               pfap.ARBEITSGANG_KURZTEXT_1,
               pfap.ARBEITSGANG_KURZTEXT_2,
               pfap.BEZEICHNUNG,
               pfap.AUFTRAGSMENGE,
               pfap.BEARBEITUNGSZEIT,
               pfap.BEARBEITUNGSZEIT_IST,
               pfak.ARTIKEL_NR,
               pfak.BEZEICHNUNG_1
    ORDER BY   pfgj.RUECKMELDE_NR, pfgj.RUECKMELDE_POSITIONS_NR
    Dies ist mein SQL - String bei der DB handelt es sich um ein Oracle System denke aber das das hier nix zur Sache hat. (Habe mir die Regeln durchgelesen und denke das ist ein reines SQL Problem)

    So mein Problem ist jetzt die letzte Zeile im WHERE Bereich also die Datumseingrenzung. Die Spalte pfgj.RUECKMELDE_POSITIONS_NR soll später ALLE Positionen der eigentlichen Rückmeldenummern anzeigen wenn ich hier aber per Datum selektiere werden natürlich nur die Positionen angezeigt die in diesem Datumsbereich liegen.

    Ich hoffe das war verständlich erklärt sollte ein Mod oder Admin denken das dieses post doch eher in die Oracle Fraktion gehöhrt einfach komentarlos löschen ich werd es dann neu erstelln.

    lg

    PS: Ich hoffe ihr könnt mir dabei helfen.

  • #2
    So mein Problem ist jetzt die letzte Zeile im WHERE Bereich also die Datumseingrenzung. Die Spalte pfgj.RUECKMELDE_POSITIONS_NR soll später ALLE Positionen der eigentlichen Rückmeldenummern anzeigen wenn ich hier aber per Datum selektiere werden natürlich nur die Positionen angezeigt die in diesem Datumsbereich liegen.
    Ich muss zugeben, dass mir Dein Problem nicht so ganz klar ist.
    Eine Frage hab ich noch: Ist die Spalte DATUM_ZEIT eine VARCHAR2 oder wirklich eine DATE Spalte.

    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


    • #3
      AND pfgj.DATUM_ZEIT between '20090101' and '20090229'
      Übrigens, 2009 ist den kein Schaltjahr => '20090228'
      Wenn das Feld vom Typ date ist und implizit gecastet wird, könnte die eine oder andere DBMS das als Fehler werten.
      Olaf Helper

      <Blog> <Xing>
      * cogito ergo sum * errare humanum est * quote erat demonstrandum *
      Wenn ich denke, ist das ein Fehler und das beweise ich täglich

      Comment


      • #4
        Sorry das das so lange gedauert hat war nicht im Lande,

        ja ist ein VARCHAR2.

        Aber wie gesagt ich versuch nochmal die Frage zu definieren:

        Die Datumseingrenzung funktioniert richtig also ich bekomme wirklich nur die Werte die innerhalb des spezifiziertem Bereich liegen.

        Beispiel:

        Ich gebe ein Datum ein vom 20090101 bis 20090228 (danke )

        und bekomme zb. 4 Datensätze raus:
        (der einfachheit nehme ich jetzt nur die relevanten Felder)

        RUECKMELDE_NR RUECKMELDE_POSITIONS_NR DATUM_ZEIT
        11111111 10 20090123
        11111111 20 20090125
        11111112 10 20090212
        11111113 110 20090224


        Soweit sogut, jetzt das Problem es gibt jetzt zu jeder Rückmelde_Nr mehr positionsfelder als ich hier rausbekomme. Die die hier nicht angezeigt werden liegen nicht in dem definiertem Zeitraum. (Also werden sie auch so in dieser Abfrage nicht angezeigt)

        Ich möchte jetzt aber haben das ich sozusagen einen Zeitraum eingebe wie oben und dann alle Rückmeldenummern in diesem Zeitraum gesucht werden und zusätzlich alle Positionen auch wenn diese nicht in dem Zeitraum liegen.

        Angenommen für die Rückmeldenummer 11111111 gibt es die Positionen 10,20,30,40
        und in der obrigen Abfrage fallen die 10, 20 in die Suchabfrage hinein, fehlen mir die 30 und die 40 da sie halt ein DATUM_ZEIT Feld haben das auserhalb des spezifiziertem Rahmens liegen ich möchte sie aber trotzdem angezeigt haben.


        Hoffe ich habe mich diesesmal verständlicher ausgedrückt, ich denke das dies irgendwie mit einer Unterabfrage zu lössen sein kann hab aber leider keine Ahnung wie, im normal Fall würde ich für sowas ein kleines Programm schreiben das mir erst alle Rückmeldenummern in einem Zeitraum raussucht und danach die Positionen dazu raussucht.


        lg

        bado

        Comment


        • #5
          Hi,

          dann mach das mit einem Union Select.

          Gruß
          docendo discimus

          Comment


          • #6
            Hättest du da ein Beispiel für mich?

            Ach erst mal danke für die schnelle Antwort, hab mir das mit einem UNION schon angeschaut das gibt mir ja sozusagen alle ergebnisse die auf 2 oder mehr abfragen zutreffen aber jedes ergebniss je einmal.

            SELECT RUECKMELDE_NR, RUECKMELDE_POSITIONS_NR, DATUM_ZEIT
            FROM pfgj
            WHERE
            DATUM_ZEIT between '20090101' and '20090228'
            GROUP BY
            RUECKMELDE_NR
            RUECKMELDE_POSITIONS_NR

            UNION

            SELECT alle RUECKMELDE_POSITIONS_NR von den RUECKMELDE_NR die oben ermittelt wurden ^^


            lg

            Comment


            • #7
              Hallo,

              von den RUECKMELDE_NR die oben ermittelt wurden
              das verstehe ich nicht. Die beiden Selects sind voneinander unabhängig,
              sie müssen nur in Typ und Anzahl der Argumente übereinstimmen.
              Du musst also Deinen zweiten Select so formuliern, dass Du damit die Werte findest, die beim ersten nicht rauskommen. z. B. mit der Bedingung:

              WHERE
              (DATUM_ZEIT < '20090101' OR DATUM_ZEIT> '20090228')

              Gruß
              docendo discimus

              Comment


              • #8
                erst mal: wozu das GROUP BY??
                Originally posted by bado View Post
                [HIGHLIGHT="SQL"]SELECT RUECKMELDE_NR, RUECKMELDE_POSITIONS_NR, DATUM_ZEIT
                FROM pfgj
                WHERE DATUM_ZEIT between '20090101' and '20090228'
                GROUP BY
                RUECKMELDE_NR
                RUECKMELDE_POSITIONS_NR[/HIGHLIGHT]
                da nur die anderen RueckmeldeNr'n von RückmeldeNr'n zurückegliefert werden sollen, könnte vielleicht folgende Abrage zum Ziel führen

                [HIGHLIGHT="SQL"]SELECT RUECKMELDE_NR, RUECKMELDE_POSITIONS_NR, DATUM_ZEIT
                FROM pfgj
                WHERE DATUM_ZEIT between '20090101' and '20090228'
                UNION ALL
                SELECT x.RUECKMELDE_NR, x. RUECKMELDE_POSITIONS_NR, X.DATUM_ZEIT
                FROM pfgj
                JOIN (SELECT RUECKMELDE_NR, RUECKMELDE_POSITIONS_NR, DATUM_ZEIT
                FROM pfgj
                WHERE NOT DATUM_ZEIT between '20090101' and '20090228'
                ) AS X on pfgj.RUECKMELDE_NR = X.RUECKMELDE_NR
                [/HIGHLIGHT]

                Comment


                • #9
                  da nur die anderen RueckmeldeNr'n von RückmeldeNr'n zurückegliefert werden sollen, könnte vielleicht folgende Abrage zum Ziel führen
                  Fast ganz richtig:

                  Da nur die anderen RückmeldeNr´n von RückmeldeNr´n der oben ausgewählten RückmeldeNr´n zurückgegeben werden sollen.

                  Verdammt das ist fürchterlich blöd zu erklären

                  Ich will sozusagen einen Bereich eingrenzen und alle RückmeldeNr´n aus diesem Bereich ausgeben + alle ihre Positionen aber diese Positionen haben natürlich auch dieses Datum_Zeit Feld und werden standardmässig rausgefiltert

                  UNION ist schon gut allerdings müsste ich irgendwie in der ersten Abfrage die RückmeldeNr´n in dem Zeitraum rausfinden und im 2ten alle anderen "gleichen RückmeldeNr´n" sozusagen.

                  Also RückmeldeNr´n ist kein Primärfeld da kommen öffters die gleichen vor und ich will alle gleichen wenn eines dieser Rückmeldenummern im fraglichem bereich liegt.


                  lg

                  Comment


                  • #10
                    Hallo Bado,

                    geht das vielleicht in die Richtung (vereinfacht):
                    [highlight=SQL]SELECT *
                    FROM pfgj
                    WHERE RUECKMELDE_NR IN
                    (SELECT RUECKMELDE_NR
                    FROM pfgj
                    WHERE DATUM_ZEIT BETWEEN '20090101' AND '20090228')[/highlight]
                    Also alle Positionen unabhängig vom Datum ,deren RUECKMELDE Nummer in einem Datensatz enthalten ist, der in dem Zeitbereich liegt?
                    Olaf Helper

                    <Blog> <Xing>
                    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                    Comment


                    • #11
                      Genau das ist die Erklärung die ich gesucht habe

                      Code:
                      SELECT     pfgj.RUECKMELDE_NR,
                                 pfap.RUECKMELDE_POSITIONS_NR POS,
                                 pfgj.BELEGUNGSEINHEIT_NR BE_NR,
                                 pfap.ARBEITSGANG_KURZTEXT_1,
                                 pfap.ARBEITSGANG_KURZTEXT_2,
                                 pfap.BEZEICHNUNG,
                                 pfap.AUFTRAGSMENGE,
                                 pfap.BEARBEITUNGSZEIT SOLL_ZEIT,
                                 pfap.BEARBEITUNGSZEIT_IST IST_ZEIT,
                                 pfak.ARTIKEL_NR,
                                 pfak.BEZEICHNUNG_1,
                                 pfgj.DATUM_ZEIT
                          FROM   pfgj, pfap, pfak
                         WHERE       pfgj.RUECKMELDE_NR = pfap.RUECKMELDE_NR
                                 AND pfap.RUECKMELDE_POSITIONS_NR = pfgj.RUECKMELDE_POSITIONS_NR
                                 AND pfak.RUECKMELDE_NR = pfap.RUECKMELDE_NR
                                 AND PFAK.RUECKMELDE_STATUS = 9
                                 AND pfap.BELEGUNGSEINHEIT_NR IN (15321, 15351)
                                 AND pfap.APL_ARTENSCHLUESSEL = 10
                                 AND pfap.ARBEITSPLAN_NR != 'BEST'
                                
                                 AND pfgj.RUECKMELDE_NR IN
                                      (SELECT RUECKMELDE_NR FROM pfgj WHERE DATUM_ZEIT BETWEEN '20090101' AND '20090228')
                      
                      
                      
                                 
                      GROUP BY   pfgj.RUECKMELDE_NR,
                                 pfap.RUECKMELDE_POSITIONS_NR,
                                 pfgj.BELEGUNGSEINHEIT_NR,
                                 pfap.ARBEITSGANG_KURZTEXT_1,
                                 pfap.ARBEITSGANG_KURZTEXT_2,
                                 pfap.BEZEICHNUNG,
                                 pfap.AUFTRAGSMENGE,
                                 pfap.BEARBEITUNGSZEIT,
                                 pfap.BEARBEITUNGSZEIT_IST,
                                 pfak.ARTIKEL_NR,
                                 pfak.BEZEICHNUNG_1,
                                 pfgj.DATUM_ZEIT
                      ORDER BY   pfgj.RUECKMELDE_NR, pfap.RUECKMELDE_POSITIONS_NR

                      Wobei bin grad draufgekommen jetzt bekomme ich alle Datensätze zurück, also irgendwo muss noch der Hund drinn sein habe bei einer Rückmeldenummer kontrolliert ob alles richtig ist und musste feststellen das keine der Rückmeldenummern im festgelegtem Bereich ist.

                      Comment


                      • #12
                        Naja gut is ja eigentlich auch klar ich frag ja jetzt nur ab ob irgendein Datensatz da drin in dem Zeitraum ist und wenn ja ist dieser "Filter" True deshalb sehe ich auch alle Datensätze.

                        Comment

                        Working...
                        X