SQL Update mit inner Join über 2 Tabellen

Guten Tag,
Ich möchte die Spalte der ersten Tabelle mit der gebildeten Summe aus einer anderen Tabelle updaten.

Meine Lösung:
UPDATE Artikel
SET Artikel.Istbestand = (SELECT Sum(ArtikelLagerBestand.Bestand) FROM ArtikelLagerBestand where ArtikelLagerBestand.ArtikelNr = Artikel.ArtikelNr Group by ArtikelLagerBestand.ArtikelNr)
from Artikel
INNER JOIN ArtikelLagerBestand ON Artikel.ArtikelNr = ArtikelLagerBestand.ArtikelNr

Das geht auch aber bei der Anzeige wie viel Datensätze geändert wurden, werden weniger angegeben als vorhanden.

Hat jemand eine Erklärung?

Gruß Werner

Hallo Werner,

durch den Inner Join aktualisierst du nur Artikel, die auch in der Tabelle ArtikelLagerBestand enthalten sind. Möchtest du alle Datensätze der Tabelle Artikel aktualisieren, müsstest du die beiden Tabellen mit einem Left Join verbinden.

schönen Gruß
Stefan

Moin Werner,

es gibt wohl Artikel(nummern), die keinen Eintrag im ArtikelLagerBestand haben. Die Verknüpfung mittels
„INNER JOIN ArtikelLagerBestand ON Artikel.ArtikelNr = ArtikelLagerBestand.ArtikelNr“ schrängt die zu aktualisierenden Artikeldatensätze auf die ein, zu denen ein ArtikelLagerBestand-Eintrag gefunden wird. Lässt Du die Bedingung weg, erhalten die Artikel, zu denen kein ArtikelLagerBestand-Eintrag zu finden ist, den „Istbestand = 0“, was ja vermutlich gewollt ist,
da es sonst Artikel in Deinem System gibt, die nicht den richtigen Istbestand ausweisen.

Gruß Berthold

Hallo Berthold,

in der Tabelle Artikel sind über 4000 Artikel. In ArtikelLagerBestand 3597 verschiedene. Geändert werden 3577. Kann es sein das 20 Artikel die in ArtikelLagerBestand vorhanden sind in Artikel nicht vorhanden sind?

Gruß Werner

Hallo Werner,

folgendes SQL wird Dir dann die 20 Artikelnummern ausweisen:

SELECT alb.ArtikelNr
FROM ArtikelLagerBestand alb
WHERE NOT EXISTS (
SELECT 1
FROM Artikel a
WHERE a.ArtikelNr = alb.ArtikelNr
);

Berthold

Hast Du 'mal kontrolliert, ob bei den Änderungen vieleicht nur die Datensätze gezählt werden, die tatsächlich geändert wurden, d.h. bei denen die Summe der Bestände anders ist als vorher?

Hast Du 'mal kontrolliert, ob bei den Änderungen vieleicht nur die Datensätze gezählt werden, die tatsächlich geändert wurden, d.h. bei denen die Summe der Bestände anders ist als vorher?
.

Hallo!
Leider hast du nicht angegeben, welche Programmiersprache und welche Datenbank du verwendest. Ich gehe mal davon aus, es handelt sich um PHP/MySql, weil diese Kombination meistens eingesetzt wird.
Ich würde solche Abfragen auf jeden Fall Schritt für Schritt im PHP-Code abarbeiten und für die Datenbankabfragen einfachste SQL-Anweisungen oder besser noch eine Datenbankzugriffsklasse verwenden. Damit werden die SQL-Statements für das jeweils verwendete DBMS von einer separaten Abstraktionsschicht übernommen. D.h., der Code ist komplett unabhängig von der eingesetzten Datenbank. Ein späterer Wechsel auf z.B. PostgreSql ist somit problemlos möglich. Die SQL-Syntax der einzelnen Datenbanken kann sehr unterschiedlich sein - gerade bei komplexeren Statements mit Subselects oder Foreign Keys!
Für deinen Fall hieße das konkret, erst die Summe zu ermitteln, diese in einer PHP-Variablen zwischenzuspeichern und in einem zweiten Step diesen Wert in die entsprechende Tabelle zu schreiben.
Gruß, Daniel

Hallo zusammen

Danke für Eure Antworten.
Ich benutze MS-SQL und VB.NET.
Meine Frage wurde durch Berthold bestens beantwortet.

Gruß Werner

Hallo WMFink,

sorry, wenn ich mich erst jetzt zu deine Frage melden kann.

Der Grund ist realtiv einfach. Du aktualisierst nur die Datensätze der Tabelle Artikel, die auch in der Tabelle ArtikelLagerbestand vorkommen. Du hast zwischen der Tabelle Artikel und der Tabelle Artikelbestand ja einen INNER JOIN über die Spalte Artikel angegeben.

Wenn du folgendes SQL absetzt bekommst du heraus, welche Artikel nicht im ArtikelLagerBestand vorhanden sind:

SELECT
A.Artikel
FROM
Artikel A
LEFT JOIN ArtikelLagerBestand AB ON AB.ArtikelNr = A.Artiel
WHERE
AB.Artikel IS NULL

Viele Grüße Holger