Update where ISelect Unterabfrage Ausdruck ergibt mehr als eine Zeile

Hallo,
ich möchte gerne folgende Beispiel-Tabelle updaten.

ID- sellingnr - rgnr - corrnr
1 ------ 1 ----- 0 ------- NULL
2 ------ 2 ----- 1 ------- NULL
3 ------ 3 ----- 2 ------- NULL
4 ------ 4 ----- NULL - NULL
5 ------ 2 ----- NULL - NULL
6 ------ 3 ----- NULL - NULL

Der update Befehl soll alle Datensätze updaten (corrnr=true) für die rgnr NULL ist und für die sellingnr zwei oder mehrmals in der Tabelle vorkommt.
Also bei dem Beispiel müsste ID 5 und 6 jeweils ein True bei corrnr bekommen.

Ich hatte mir zunächst sowas gedacht, aber da die Unterabfrage bei dem where ja mehrere Ergebnisse zurückliefert, kommt ein Fehler.

update bestellungen4 set correction_rg=true where sellingmanagersalesrecordnumber=(select sellingmanagersalesrecordnumber from bestellungen4 group by sellingmanagersalesrecordnumber having count(sellingmanagersalesrecordnumber)>1) AND rg_nr IS NULL;
SQL-Fehler: FEHLER: als Ausdruck verwendete Unteranfrage ergab mehr als eine Zeile

Wie kann man das lösen?
Vielen Dank
LG

test=# select * from texs89 ;
 id | sellingnr | rgnr | corrnr 
----+-----------+------+--------
  1 |         1 |    0 | 
  2 |         2 |    1 | 
  3 |         3 |    2 | 
  4 |         4 |      | 
  5 |         2 |      | 
  6 |         3 |      | 
(6 rows)

test=*# with 
  a as (
    select 
      id
      , count(1) over (partition by sellingnr) 
    from texs89
  )
  , b as (
    select 
      id 
    from texs89 
    where rgnr is null
  )
  ,id as (
    select 
      a.id 
    from a 
      inner join b on a.id=b.id 
    where a.count > 1
  ) 

update texs89 set corrnr = true where id in (select id from id) ;

UPDATE 2

Ich würde das so machen:

update bestellungen4
  set correction_rg = true
where id in (select id 
             from (
               select id, 
                      row_number() over (partition by sellingnr order by id) as rn
               from bestellungen4
             ) t
             where rn > 1)

Online Beispiel

1 Like

Super, funktioniert beides wunderbar, vielen Dank!

1 Like

Ich finde den Weg von @castorp am schönsten. Das “where …in …” würde ich aber noch gerne loswerden:
update texs89 t set corrnr = true
from ( select id, row_number () over ( partition by sellingnr order by id) as rn from texs89 ) t1
where t.id = t1.id
and t1.rn > 1