Announcement

Collapse
No announcement yet.

Update "Subquery returned more than one row"

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

  • Update "Subquery returned more than one row"

    Hallo,

    ich versuche mit dem folgendem SQL eine Spalte in einer Tabelle upzudaten.
    Es handelt sich um eine Tabelle mit Historischen Werten (Eingeteilt nach Perioden). Es sollen die aktiven Kunden, d.h. die Kunden, welche in den letzten 12 Monaten (ausgehend von der aktuellen Periode) Umsatz hatten, gekenntzeichnet werden. (1 oder 0)

    UPDATE TEMP_CUSTOMERSTATISTIC
    SET ACTIVECUSTOMER12MONTH =
    (select (case when sum(TURNOVER) > 0 then 1 else 0 end) from TEMP_CUSTOMERSTATISTIC cs, PERIODREFERENCES pr
    WHERE
    pr.period = (currentperiod) and
    pr.periodlastyear <= cs.period
    group by customerno)
    WHERE
    period = (currentperiod)-1

    Wenn ich dieses SQL ausführen will, bekomme ich diese Fehlermeldung:
    "Subquery returned more than one row"

    Das eingebettete Select habe ich bereits getestet. Funktioniert auch soweit.

    Das gesamte Update Statement funktioniert auch, wenn ich das group by customerno weg lasse. Dann updatet mir das Skript aber die komplette Spalte "ACTIVECUSTOMER12MONTH" mit 1.

    Ich habe jetzt schon einiges ausprobiert, aber bisher leider ohne Erfolg.

    Ach ja, der Vollständigkeithalber hier noch die DB auf der das Statement laufen soll:
    IBM Redbrick (Informix)

    Wenn mir jemand zum Lösen dieses Problems einen Tipp geben könnte, wäre das echt klasse!

    Grüße
    mahoini

  • #2
    UPDATE TEMP_CUSTOMERSTATISTIC t
    SET ACTIVECUSTOMER12MONTH =
    (select (case when sum(TURNOVER) > 0 then 1 else 0 end) from
    TEMP_CUSTOMERSTATISTIC cs, PERIODREFERENCES pr
    WHERE
    pr.period = (currentperiod) and
    pr.periodlastyear <= cs.period and
    customerno = t.customerno)
    WHERE
    period = (currentperiod)-1
    Zuletzt editiert von Markus Kinzler; 10.07.2007, 15:56.

    Comment


    • #3
      Danke für die schnelle Antwort!

      Mir ist aber noch nicht ganz klar, woher das customerno = t.customerno) kommt? Der Tabellen Alias "t" ist ja nicht vergeben, oder wie habe ich das zu verstehen? (Sorry, das Thema SQL ist noch relativ neu für mich... )

      Comment


      • #4
        Sorry, hab noch mal genauer hingeschaut.

        Der "t" Alias ist vergeben. (man muss genau hinschaun

        Leider funktioniert diese Lösung (zumindest bei mir) nicht...

        Bekomme folgende Fehlermeldung:
        " Invalid syntax '...UPDATE TEMP_CUSTOMERSTATISTIC <==>T'. "

        Grüße

        Comment


        • #5
          Welches DBMS?

          Comment


          • #6
            IBM Redbrick... ist nicht wirklich verbreitet. Zudem gibt IBM für dieses System nur wiederwillig support.

            Ich habe gerade versucht, das Skript folgendermaßen anzupassen...

            UPDATE TEMP_CUSTOMERSTATISTIC
            SET ACTIVECUSTOMER12MONTH =
            (select (case when sum(TURNOVER) > 0 then 1 else 0 end) from
            TEMP_CUSTOMERSTATISTIC cs, PERIODREFERENCES pr
            WHERE
            pr.period = (currentperiod) and
            pr.periodlastyear <= cs.period and
            customerno = cs.customerno)
            WHERE
            period = (currentperiod)-1

            ... es gab dann zwar keinen Fehler mehr, das Feld wird aber wieder nur mit "1" gefüllt...

            Comment


            • #7
              Ich meinte natürlich den Kunden Part mit " ... = cs.customerno"

              Comment


              • #8
                Hallo!

                Probier mal:
                UPDATE TEMP_CUSTOMERSTATISTIC
                SET ACTIVECUSTOMER12MONTH =
                (select (case when sum(TURNOVER) > 0 then 1 else 0 end) from
                TEMP_CUSTOMERSTATISTIC cs, PERIODREFERENCES pr
                WHERE
                pr.period = (currentperiod) and
                pr.periodlastyear <= cs.period and
                customerno = TEMP_CUSTOMERSTATISTIC.customerno)
                WHERE
                period = (currentperiod)-1

                BYE BERND

                Comment


                • #9
                  Danke für den Tipp. Ich hab es probiert, leider ohne Erfolg... die Abfrage lief bis gerade (ca 20 min).
                  Mich wundert es bloß, dass ich immer ein "Subquery returned more than one row" zurück bekomme?

                  Ich dachte, das es vielleicht an dem CASE liegt, da es sich hierbei ja eigentlich um ein if handelt und hier zwischen mehreren möglichen Zuständen unterschieden werden kann... Aber auch ohne das CASE im Update (Hab es jetzt mit einer temporären Tabelle als Zwischenschritt probiert) kommt ide selbe Fehlermeldung.

                  Comment


                  • #10
                    Mich wundert es bloß, dass ich immer ein "Subquery returned more than one row" zurück bekomme?
                    Mich nicht, da ja der Subquery alle Datensätze aller Kunden in diesem Zeitraum zurückliefert.
                    Bernds Einschränkung bringt auch nichts da sie ja sagt alle Datensätze, die mit sich selbst identisch sind also alle Datensätze.
                    Die einzige Möglichkiet wäre den Subquery auf den jeweiligen Datensatz der äußeren Abfrage (Update) zu beschränken, was mit einem Alias auf die äußere Tabelle funktionieren würde.
                    Das hat das DBMS aber leider nicht verstanden :-(
                    Untertützt es SPs?

                    Comment

                    Working...
                    X