# Gehalt um 1000 erhöhen



## Gast (7. Dez 2008)

Hallo,

ich möchte in einer Tabelle

VORNAME NACHNAME GEHALT 

das Einkommen der 3, die am wenigsten verdienen, um 1000 erhöhen,


das folgende SQL-Statement liefert die 3 Mitarbeiter mit dem wenigsten Gehalt aber ich weiß nicht, wie ich das so um/einbauen kann, dass sich das Gehalt dieser 3 erhöht 

```
SELECT vorname, nachname, gehalt
FROM (
  SELECT vorname, nachname, gehalt
  FROM mitarbeiter
  WHERE gehalt IS NOT NULL
  ORDER BY gehalt asc)
WHERE ROWNUM <= 3
```

Wäre Euch dankbar wenn Ihr mir helfen könntet, DB ist Oracle
Vielen Dank,


----------



## Guest (8. Dez 2008)

:wink: 
	
	
	
	





```
SELECT vorname, nachname, 1000 + gehalt
```


----------



## Gast (8. Dez 2008)

Moin,

ich meinte schon, dass sich das Gehalt in der Tabelle um 1000 erhöht, also werde ich da ein UPDATE brauchen aber ich weiß nicht wie ich diese UPDATE einbauen kann und wäre daher dankbar für hilfe in diese Richtung,

Vielen Dank,


----------



## foobar (8. Dez 2008)

Bei Oracle kannst du im Update einen Subselect verwenden. Ansonsten würde ich das Ergebnis deiner Abfrage in einer View oder temporären Tabelle speichern und dann mit nem Update darüber joinen.

http://www.wcm.at/forum/showthread.php?t=216808


----------



## Guest (8. Dez 2008)

Mit dem SQL- Statement unten bekomme ich den Fehler, das die Unterabfrage zu viele Ergebnisse liefert,
was kann ich da machen?
Vielen Dank,



```
update employees set salary = (SELECT salary
    FROM (SELECT salary + 1000
              FROM employees
              WHERE salary IS NOT NULL
              ORDER BY salary asc)
              WHERE ROWNUM <= 3);
```


----------



## SlaterB (8. Dez 2008)

na die Anfrage ist ja auch schlecht


```
update employees set salary = salary + 1000 WHERE id IN (SELECT id der drei Niedrigverdiener);
```

was ist eigentlich, wenn 4 das gleiche verdienen, Zufallsentscheidung?


----------



## FenchelT (9. Dez 2008)

*smile* hatte ich mich auch schon gefragt  :lol:


----------



## FenchelT (9. Dez 2008)

Ich habe damit mal ein wenig rumgespielt, allerdings unter MSSQL 2005

Gegeben die folgende Tabelle mit den Feldern id, name, gehalt:
1	Donald	4000
2	Daisy	4000
3	Tick	4000
4	Trick	4000
5	Track	5000
6	Daniel	4000
7	Dagobert	20000
8	Mickey	6000
9	Goofy	4500
10	Mini	2500


```
select top 1 id
from daten 
where gehalt = (SELECT min(gehalt) from daten)
UNION
select id from daten
where gehalt =(
				select  min(gehalt)
				from daten 
				where gehalt > ALL (Select min(gehalt) from daten)
			   )

order by id asc
```


Als Ergebnis werden nun die IDs mit den beiden niedrigsten Werten zurueckgegeben. Zum "drittniedrigsten Wert" bin ich aber noch nicht gekommen:

Ergebnis IDs:
1
2
3
4
6
10


----------



## VoiDee (13. Dez 2008)

Anonymous hat gesagt.:
			
		

> Mit dem SQL- Statement unten bekomme ich den Fehler, das die Unterabfrage zu viele Ergebnisse liefert,
> was kann ich da machen?
> Vielen Dank,
> 
> ...



Dieses Update Statement beinhaltet ein potenzielles Problem: wenn es mehrere User gibt, die auf dem dritten Platz liegen (also das dritt-niedrigste Gehalt haben), dann bekommt nur einer davon die 1000 mehr. Welcher das ist, entscheided die Oracle-DB relativ willkürlich.

Uch würde daher mit einem Ranking arbeiten.


----------

