SQL Befehle kombinieren inkl. Übernahme des Ergebnis

Chimera16

Aktiver Benutzer
Beiträge
26
Hallo liebes Datenbankforum,

ich stehe vor einem Problem in SQL und hoffe Ihr könnt mir weiterhelfen...

Ich führe immer 2 SQL Abfragen aus (Die Artikelnummer ist mir im vorraus bekannt):
1. SELECT kArtikel FROM dbo.tartikel where cArtNr = '%Artikelnummer%'
Diese Abfrage gibt mir die einzigartige ID eines Artikels. Danach folgt die 2. SQL Abfrage:
2. Update tWarenLagerPlatzArtikel set fAnzahl='0' where kArtikel = '%ArtID%'
Wobei ArtID die angesprochene einzigartige ID ist, die ich durch die erste Abfrage erhalte.

Kann man diese beiden Abfragen in einer kombinieren? Im Internet habe ich viel dazu gefunden, aber speziell in meinem Fall habe ich das Problem dass ich die 2. Abfrage erst dann kenne, wenn ich die Erste ausgeführt habe...

Ich hoffe ich habe die Problematik verständlich rüber gebracht.
Ich habe leider kaum Kenntnisse in SQL, dehalb entschuldigt wenn dies eine Anfängerfrage ist.

Ich bedanke mich im Vorraus!
 
Werbung:
Hi Chimera.

Dazu kannst du einen einfachen Subselect benutzen:
Code:
UPDATE tWarenLagerPlatzArtikel
SET fAnzahl = '0'
WHERE kArtikel = (
    SELECT kArtikel
    FROM tArtikel
    WHERE cArtNr = '%Artikelnummer%'
)

Gruß
Hony
 
Zwei Sachen fallen mir da noch auf:

Update tWarenLagerPlatzArtikel set fAnzahl='0' where kArtikel = '%ArtID%'

Ist das Anzahlfeld jetzt numerisch, also eine Zahl, oder alphanumerisch, weil Du es unter Anführungszeichen setzt?

Im Where, warum benutzt Du immer %? Das % ist ein Platzhalter und für LIKEs gedacht, also eine Abfrage wie WHERE kArtikel LIKE '1%' (liefert alle die mit 1 beginnen) oder WHERE kArtikel LIKE '%1%' (liefert alle die irgendwo eine 1 haben).
 
@Hony% Ich danke dir, genauso wollte ich es haben! Damit hilfst du mir sehr weiter!

@Walter Das Anzahlfeld ist Nummerisch (Zur Erklärung: Ich versuche eine Artikeldatenbank zu updaten fAnzahl ist dabei die Menge des vorhandenen Produktes und kArtikel ist die Artikelnummer). Zu den %, ich erstelle den SQL Befehl aus der Windows Batch (Damit kenne ich mich zumindest ein bisschen aus :)) Also ist %Artikelnummer% eine Windows Batch Variable die eine Zahl beeinhaltet. So sehen die "reinen" SQL Abfragen dank Hony jetzt bei mir aus:

UPDATE tWarenLagerPlatzArtikel SET fAnzahl ='0' WHERE kArtikel = (SELECT kArtikel FROM tArtikel WHERE cArtNr = '135202')
UPDATE tWarenLagerPlatzArtikel SET fAnzahl ='2' WHERE kArtikel = (SELECT kArtikel FROM tArtikel WHERE cArtNr = '125887')
UPDATE tWarenLagerPlatzArtikel SET fAnzahl ='0' WHERE kArtikel = (SELECT kArtikel FROM tArtikel WHERE cArtNr = '156013')
UPDATE tWarenLagerPlatzArtikel SET fAnzahl ='4' WHERE kArtikel = (SELECT kArtikel FROM tArtikel WHERE cArtNr = '131689')
UPDATE tWarenLagerPlatzArtikel SET fAnzahl ='4' WHERE kArtikel = (SELECT kArtikel FROM tArtikel WHERE cArtNr = '125883')
UPDATE tWarenLagerPlatzArtikel SET fAnzahl ='20' WHERE kArtikel = (SELECT kArtikel FROM tArtikel WHERE cArtNr = '111532')
UPDATE tWarenLagerPlatzArtikel SET fAnzahl ='20' WHERE kArtikel = (SELECT kArtikel FROM tArtikel WHERE cArtNr = '131813')
UPDATE tWarenLagerPlatzArtikel SET fAnzahl ='1' WHERE kArtikel = (SELECT kArtikel FROM tArtikel WHERE cArtNr = '124273')
UPDATE tWarenLagerPlatzArtikel SET fAnzahl ='69' WHERE kArtikel = (SELECT kArtikel FROM tArtikel WHERE cArtNr = '77892')
UPDATE tWarenLagerPlatzArtikel SET fAnzahl ='1' WHERE kArtikel = (SELECT kArtikel FROM tArtikel WHERE cArtNr = '125881')
UPDATE tWarenLagerPlatzArtikel SET fAnzahl ='3' WHERE kArtikel = (SELECT kArtikel FROM tArtikel WHERE cArtNr = '125879')
UPDATE tWarenLagerPlatzArtikel SET fAnzahl ='1' WHERE kArtikel = (SELECT kArtikel FROM tArtikel WHERE cArtNr = '127982')
UPDATE tWarenLagerPlatzArtikel SET fAnzahl ='1' WHERE kArtikel = (SELECT kArtikel FROM tArtikel WHERE cArtNr = '88287')
UPDATE tWarenLagerPlatzArtikel SET fAnzahl ='0' WHERE kArtikel = (SELECT kArtikel FROM tArtikel WHERE cArtNr = '127648')

USW....

Eine Frage habe ich jetzt noch, ist es möglich in der SQL Abfrage zu überprüfen wie groß ein Wert ist?
Eigentlich bin ich sehr zufrieden so, aber wenn es möglich ist würde ich gerne das jeder Bestand der größer ist als 30, nur als 30 angezeigt wird. In den Beispielen oben gibt es ja die Zeile:
UPDATE tWarenLagerPlatzArtikel SET fAnzahl ='69' WHERE kArtikel = (SELECT kArtikel FROM tArtikel WHERE cArtNr = '77892')

Das heißt fAnzahl wird auf 69 gesetzt. Kann SQL merken, dass 69 größer als 30 ist und dann statt 69 fAnzahl auf 30 setzen?

Ich danke euch!
 
Eine Frage habe ich jetzt noch, ist es möglich in der SQL Abfrage zu überprüfen wie groß ein Wert ist?
Eigentlich bin ich sehr zufrieden so, aber wenn es möglich ist würde ich gerne das jeder Bestand der größer ist als 30, nur als 30 angezeigt wird. In den Beispielen oben gibt es ja die Zeile:
UPDATE tWarenLagerPlatzArtikel SET fAnzahl ='69' WHERE kArtikel = (SELECT kArtikel FROM tArtikel WHERE cArtNr = '77892')

Das heißt fAnzahl wird auf 69 gesetzt. Kann SQL merken, dass 69 größer als 30 ist und dann statt 69 fAnzahl auf 30 setzen?

Ich danke euch!


Das könnte man mit trivial einem TRIGGER lösen.
 
Zuletzt bearbeitet von einem Moderator:
Zu den %, ich erstelle den SQL Befehl aus der Windows Batch (Damit kenne ich mich zumindest ein bisschen aus :)) Also ist %Artikelnummer% eine Windows Batch Variable die eine Zahl beeinhaltet.

Worauf @Walter hinaus wollte ist, dass du deine Zahlenwerte durch die '' als String-Literal übergibst. Das frisst unnötig Rechenkapazität da die Datenbank den String erst parsen und umwandeln muss. Zahlen-Literale werden ohne Anführungsstriche übergeben.

Eine Frage habe ich jetzt noch, ist es möglich in der SQL Abfrage zu überprüfen wie groß ein Wert ist?
Eigentlich bin ich sehr zufrieden so, aber wenn es möglich ist würde ich gerne das jeder Bestand der größer ist als 30, nur als 30 angezeigt wird. In den Beispielen oben gibt es ja die Zeile:
UPDATE tWarenLagerPlatzArtikel SET fAnzahl ='69' WHERE kArtikel = (SELECT kArtikel FROM tArtikel WHERE cArtNr = '77892')

Das heißt fAnzahl wird auf 69 gesetzt. Kann SQL merken, dass 69 größer als 30 ist und dann statt 69 fAnzahl auf 30 setzen?
Das lässt sich in der Tat wie von @akretschmer vorgeschlagen bequem mit einem TRIGGER lösen. Allerdings stelle ich mir hier die Frage warum man falsche Daten in einer Datenbank speichern will. Für sinnvoller halte ich in einem so einem Fall eine angepasste VIEW die den Wert für die Anzeige/Ausgabe auf max 30 beschränkt.
 
@akretschmer @Hony% Danke euch erstmal für eure Antworten! Ich habe die Anführungsstriche entfernt. Hätte einer von euch vielleicht ein Beispiel wie ich das mit einem Trigger lösen könnte?

@Hony% wegen dem "warum" zu den falschen Werten: Insgesamt führe ich 5 solcher Abfragen durch (die alle das gleiche Muster haben wie die, die ich oben genannt habe). Eine der 5 Abfragen weißt den Bestand meinem Ebay Account zu, sodass ich immer auf meinem Ebaykonto den aktuellen Warenbestand habe.
Jetzt gibt es aber das Problem, dass Ebay die maximale Anzahl an Warenwert beschränkt. Mein Ebay Account darf z.B. nicht mehr als Warenwert in höhe von 10.000€ anbieten. Wenn jetzt also die Abfrage von oben meinen Warenbestand direkt auf 69 setzt, dann kann ich bei Ebay vielleicht 10 Produkte anbieten. :)
Deshalb würde ich gerne die anderen 4 Abfragen so lassen wie sie jetzt sind, mit dem "echten" Warenbestand und die Ebay Abfrage gerne mit einem "falschen" Bestand ausführen. Zumindest so, dass ich niemals mehr als z.B. 20 oder 30 identische Artikel in Reserve habe. Ich hoffe, ich habe mich nicht zu kompliziert ausgedrückt.

Viele Grüße
 
@akretschmer @Hony% Danke euch erstmal für eure Antworten! Ich habe die Anführungsstriche entfernt. Hätte einer von euch vielleicht ein Beispiel wie ich das mit einem Trigger lösen könnte?

In PostgreSQL:

Code:
test=# create table chimera (id int primary key, val int);
CREATE TABLE
test=*# create or replace function set_val_to_30() returns trigger as $$begin new.val := 30; return new; end;$$language plpgsql;
CREATE FUNCTION
test=*# create trigger trg_chimera1 before update on chimera for each row when (new.val > 30) execute procedure set_val_to_30();
CREATE TRIGGER
test=*#
test=*#
test=*#
test=*# insert into chimera values (1, 10);
INSERT 0 1
test=*# insert into chimera values (2, 10);
INSERT 0 1
test=*# update chimera set val = 20 where id = 1;
UPDATE 1
test=*# update chimera set val = 200 where id = 2;
UPDATE 1
test=*# select * from chimera ;
 id | val
----+-----
  1 |  20
  2 |  30
(2 rows)

Mit MySQL spiel ich nicht.
 
Werbung:
Zurück
Oben