1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

SQL Befehle kombinieren inkl. Übernahme des Ergebnis

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Chimera16, 11 Oktober 2014.

  1. Chimera16

    Chimera16 Aktiver Benutzer

    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!
     
  2. Hony%

    Hony% Datenbank-Guru

    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
     
  3. Walter

    Walter Administrator Mitarbeiter

    Zwei Sachen fallen mir da noch auf:

    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).
     
  4. Chimera16

    Chimera16 Aktiver Benutzer

    @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!
     
  5. akretschmer

    akretschmer Datenbank-Guru


    Das könnte man mit trivial einem TRIGGER lösen.
     
    Zuletzt von einem Moderator bearbeitet: 12 Oktober 2014
  6. Hony%

    Hony% Datenbank-Guru

    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.

    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.
     
  7. Chimera16

    Chimera16 Aktiver Benutzer

    @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
     
  8. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  9. Chimera16

    Chimera16 Aktiver Benutzer

    @akretschmer @Hony% Ich danke euch beiden! Ich habe gestern und heute noch ein bisschen rumprobiert, es klappt alles wunderbar. :)

    Vielen Dank und euch eine angehme Woche
     
    Hony% und akretschmer gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden