# Update where ISelect Unterabfrage Ausdruck ergibt mehr als eine Zeile

**URL:** https://www.pg-forum.de/t/update-where-iselect-unterabfrage-ausdruck-ergibt-mehr-als-eine-zeile/12022
**Category:** SQL
**Created:** [25. August 2020 um 11:01 UTC](https://www.pg-forum.de/t/update-where-iselect-unterabfrage-ausdruck-ergibt-mehr-als-eine-zeile/12022 "2020-08-25T11:01:38Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![texs89](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/t/ea5d25/32.png) [@texs89](https://www.pg-forum.de/u/texs89)
#### Post date: [25. August 2020 um 11:01 UTC](https://www.pg-forum.de/t/update-where-iselect-unterabfrage-ausdruck-ergibt-mehr-als-eine-zeile/12022/1 "2020-08-25T11:01:38Z")

</div>

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

---

<div class="post-metadata">

### Author: ![akretschmer](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/a6a055/32.png) [@akretschmer](https://www.pg-forum.de/u/akretschmer)
#### Post date: [25. August 2020 um 11:23 UTC](https://www.pg-forum.de/t/update-where-iselect-unterabfrage-ausdruck-ergibt-mehr-als-eine-zeile/12022/2 "2020-08-25T11:23:29Z")

</div>

```
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

---

<div class="post-metadata">

### Author: ![castorp](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/c/e99b99/32.png) [@castorp](https://www.pg-forum.de/u/castorp)
#### Post date: [25. August 2020 um 12:33 UTC](https://www.pg-forum.de/t/update-where-iselect-unterabfrage-ausdruck-ergibt-mehr-als-eine-zeile/12022/3 "2020-08-25T12:33:50Z")

</div>

Ich würde das so machen:

```sql
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](https://dbfiddle.uk/?rdbms=postgres_12&fiddle=c54164b4593a55f508c72f1b086a9ac4)

---

<div class="post-metadata">

### Author: ![texs89](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/t/ea5d25/32.png) [@texs89](https://www.pg-forum.de/u/texs89)
#### Post date: [25. August 2020 um 15:55 UTC](https://www.pg-forum.de/t/update-where-iselect-unterabfrage-ausdruck-ergibt-mehr-als-eine-zeile/12022/4 "2020-08-25T15:55:00Z")

</div>

Super, funktioniert beides wunderbar, vielen Dank!

---

<div class="post-metadata">

### Author: ![pogomips](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/p/bbe5ce/32.png) [@pogomips](https://www.pg-forum.de/u/pogomips)
#### Post date: [26. August 2020 um 17:10 UTC](https://www.pg-forum.de/t/update-where-iselect-unterabfrage-ausdruck-ergibt-mehr-als-eine-zeile/12022/5 "2020-08-26T17:10:33Z")

</div>

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

---

<div class="post-metadata">

### Author: ![system](https://www.pg-forum.de/uploads/default/original/1X/dc97a981dd26692d5fb52e8b8fc7c090d7b9559a.png) [@system](https://www.pg-forum.de/u/system)
#### Post date: [21. Februar 2021 um 07:08 UTC](https://www.pg-forum.de/t/update-where-iselect-unterabfrage-ausdruck-ergibt-mehr-als-eine-zeile/12022/6 "2021-02-21T07:08:57Z")

</div>


