PDA

View Full Version : SQL Fetch First 1 Rows



USDAVIS
21-08-09, 15:56
Hallo *All,

wenn ich folgenden Select absetze:

select preis from artikelstamm
where nummer = 150000
fetch first 1 rows only

funktioniert das tadellos und ich bekomme wirklich nur den ersten gefundenen Satz angezeigt.

Gebe ich aber ein:

update artikelstamm
set preis =
(select preis from artikelstamm
where nummer = 150000
fetch first 1 rows only )
where nummer = 100000

bekomme ich die Fehlermeldung:

Schlüsselwort FETCH nicht erwartet. Gültige Token: ) UNION EXCEPT.

Geht der Fetch First in einem Subselect nicht oder ist meine Syntax falsch?

Gruss
Ulli

Fuerchau
21-08-09, 16:25
Fetch im Subselect gibts leider wirklich nicht. Hier musst du dir eine andere Methode ausdenken, um nur 1 Satz zu bekommen.

USDAVIS
21-08-09, 16:54
Danke,

(wäre ja auch zu schön gewesen)

mfg
Ulli

BenderD
21-08-09, 16:56
welchen willst du denn haben? ohne order by clause überlässt man die Reihenfolge der Sätze der Query Engine und könnte im Extremfall bei mehreren Aufrufen unterschiedliche Reihenfolgen bekommen. Fetch first ohne order by würde auf deutsch dann heißen: "gib mir irgendeinen". Will man einen bestimmten, muss man das präzise sagen:
select ...
from ...
where...
and nochnFeld = select max(...) (oder auch min(...) from... where...

D*B


Hallo *All,

wenn ich folgenden Select absetze:

select preis from artikelstamm
where nummer = 150000
fetch first 1 rows only

funktioniert das tadellos und ich bekomme wirklich nur den ersten gefundenen Satz angezeigt.

Gebe ich aber ein:

update artikelstamm
set preis =
(select preis from artikelstamm
where nummer = 150000
fetch first 1 rows only )
where nummer = 100000

bekomme ich die Fehlermeldung:

Schlüsselwort FETCH nicht erwartet. Gültige Token: ) UNION EXCEPT.

Geht der Fetch First in einem Subselect nicht oder ist meine Syntax falsch?

Gruss
Ulli

USDAVIS
25-08-09, 10:15
welchen willst du denn haben? ... Fetch first ohne order by würde auf deutsch dann heißen: "gib mir irgendeinen".

D*B

Ja, ich wollte tatsächlich irgendeinen von mehreren möglichen Sätzen mit derselben Art.nummer haben, die nur in Verbindung mit dem Lager eindeutig ist d.h. der Artikel kann in unterschiedlichen Lagern vorkommen, muss aber nicht zwangsläufig in jedem definierten Lager vorkommen. Der VKPreis ist in jedem Lager gleich und soll bei bestimmten Artikeln von anderen Artikeln übernommen werden.

Habe das jetzt im Prinzip so gelöst:

update artikelstamm
set preis =
(select preis from artikelstamm
where nummer = 150000 and
lager =
(select max(lager) from
artikelstamm where
nummer = 150000) )
where nummer = 100000

Würde Fetch First im Subselect gehen,
hätte ich mir allerdings den 2. Subselect sparen können.

Nochmals Danke für die Hinweise.

Gruss
Ulli

Pikachu
25-08-09, 11:10
Warum nicht so? Oder übersehe ich da was wichtiges?

update artikelstamm
set preis =
(select max(preis) from artikelstamm
where nummer = 150000)
where nummer = 100000

USDAVIS
25-08-09, 11:51
Bingo !

Da hab' ich ja ein ziemlich grosses
Brett vor'm Kopf gehabt.

thx
Ulli