Announcement

Collapse
No announcement yet.

Update mit CASE ! ORA-01427!

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

  • Update mit CASE ! ORA-01427!

    Hallo

    Ich moechte ein Tabelle mit folgendem querie updaten:

    Code:
    UPDATE ph2_item 
    SET order_date = (								
    SELECT 
    CASE
    	WHEN i.ship_date = i.ship_date
    	THEN (select min(i2.order_date) from ph2_temp_item i2 where i.ship_date = i2.ship_date)
    END
    from
    	ph2_item i,
    	ph2_cons_1 v
    where
    	i.customer_id = v.customer_id
    	and v.site_code >= 2)
    Leider bekomm ich damit immer die Fehlermeldung:

    ORA-01427: single-row subquery returns more than one row

    Es handelt sich um eine Oracle Datenbank.

    Kann mir jemand auf die Spruenge helfen?

    DANKE!

  • #2
    Beim CASE fehlt das ELSE
    Der select ist nicht eindeutig, auch wenn er in deinem Fall nur einen passenden Datensatz liefert.

    Comment


    • #3
      ORA-01427: single-row subquery returns more than one row

      Dann wird wohl, wie Oracle richtig sagt, das Subquery
      Code:
      SELECT 
      CASE
      	WHEN i.ship_date = i.ship_date
      	THEN (select min(i2.order_date) from ph2_temp_item i2 where i.ship_date = i2.ship_date)
      END
      from
      	ph2_item i,
      	ph2_cons_1 v
      where
      	i.customer_id = v.customer_id
      	and v.site_code >= 2)
      mehr als eine Zeile zurück geben...

      Wenn man bei Oracle den ELSE-Zweig weglassen kann, dann wird, wenn Deine WHEN-Bedingung nicht zutrifft, NULL zurückgegeben.

      (Ok bei Deine WHEN -Bedingung kann Trifft immer zu, da gleiches nu mal gleich ist..., Dann ist allerdings auch das CASE nutzlos)

      Comment


      • #4
        Du kannst die Gruppenfunktion im inneren Select weglassen und musst dann um das Ganze 'Select CASE' ein min schreiben.
        Davon abgesehen ist, wie ebis schon schreibt, das 'Select CASE' mit dem 'WHEN i.ship_date = i.ship_date' sinnfrei. Wenn du von der Update-Tabelle in die "ph2_item i," joinen willst, kannst du den inneren Select nehmen und den Join einfach da einbauen:

        UPDATE ph2_item i
        SET order_date = ( SELECT MIN(i2.order_date)
        FROM ph2_temp_item i2
        , ph2_cons_1 v
        WHERE i2.ship_date = i.ship_date
        AND v.customer_id = i.customer_id
        AND v.site_code >= 2
        )

        Comment

        Working...
        X