SQLite Update mit JOIN

Wolf-Tilmann

Aktiver Benutzer
Beiträge
35
Hallo Zusammen,

ich versuche eine Tabelle mittels eines JOINs zu aktualisieren.
Code:
UPDATE gesamtuebersicht
SET Std_Mon_G = monatsstunden.Std_Mon_G
FROM gesamtuebersicht AS Ziel
INNER JOIN
V_monatsstunden
ON ziel.einstellungsID = V_monatsstunden.einstellungsID
AND ziel.Kal_Per = V_monatsstunden.Kal_Per

SQLite gibt mir als Fehlermeldung aus:
SQLiteManager: Likely SQL syntax error: [ near "FROM": syntax error ]

Dabei habe ich den Code doch nach Suche in der allwissenden Müllhalde so übernommen?!?

Das war der Originalcode
Code:
UPDATE TabellennameA 
SET spalteA = Quelle.SpalteB
FROM TabellennameA AS Ziel
INNER JOIN TabellennameB AS Quelle
ON Ziel.Feld=Quelle.feld

Kann mir hier jemand weiterheifen?
Vielen Dank
Wolf-Tilmann
 
Werbung:
Irgendwie irritiert mich die Syntax total. Mein SQL sagt zwar die ist OK aber so hätte ich das nie geschrieben.

Vieleicht tuts auch was in der Form:
Code:
UPDATE    TabellennameA
SET        spalteA = (    SELECT    b.spalteB
                    FROM    TabellennameB b
                    WHERE    b.feld = TabellennameA.feld )
 
Gut,
anbei eine sql-Datei zum Erzeugen der Datenbank mit Musterdaten.

In der Tabelle "einzelplanungen" erfasse ich die Personalplanungen der Kurzzeitkräfte.
Die Kurzzeitkräfte können nicht nur einfach sonder x-fach beschäftigt sein.
Über den Trigger berechne ich mir, welches Gehalt auf welche Kurzzeitkraft in welchem Monat für welches ... anfällt und lasse das in die Tabelle "Gesamtuebersicht" schreiben.
Mit gegenüber wird nur mit den Gesamtkosten/Person/Monat abgerechnet. Wenn ich die mit dem View ermittelten Gesamtstunden/Monat/Person in Gesamtuebersicht.Std_Mon_G bekommen würde könnte ich mir berechnen lassen, welche Kosten je Einstellungsvorgang angefallen sind.
Beispielsweise hat Max Mustermann im November 2013 insgesamt 3 Beschäftigungen mit 25 + 5 + 5 Stunden.

Gesamtkosten/Monat/Person / Gesamtstunden/Monat/Person * Stunden/Monat/Person/Einstellungsvorgang = Kosten/Monat/Person/Einstellungsvorgang

Mein Thread meint, wie bekomme ich die Gesamtstunden als dem View in die Spalte Std_Mon_G?

Hier ist übrigens noch der Link, welcher nach meiner Ansicht am ehesten gepasst hat.
http://christian.bloggingon.net/archive/2006/09/17/update-mit-inner-join.aspx


Als nächsten Schritt muss ich noch herausfinden, wie "Gesamtuebersicht" aktualisiert wird, wenn sich Änderungen in "Einzelplanung" erfasst werden.

Einen schönen Gruß allerseits

Wolf-Tilmann
 

Anhänge

  • dbforum.txt
    14,2 KB · Aufrufe: 4
Gut,
anbei eine sql-Datei zum Erzeugen der Datenbank mit Musterdaten.

Irknwie steig ich da nicht durch, mein PG akzeptiert das SQL leider auch nicht.

Was mich wundert:

  • Deine Tabelle 'gesamtuebersicht' wird durch einen TRIGGER befüllt, dieser arbeitet aber nur bei INSERT. Wenn Du in 'einzelplanung' was änderst / löscht, dann ist diese Tabelle natürlich Schrott. Ich denke, Du solltest aus dieser Tabelle einen VIEW machen.
  • warum der UNIQUE (bereich, Abteilung, name, vorname, EUR_Std, Std_Mon, Beginn, Ende) in 'einzelplanung'? Der macht zwar keinen Schaden, aber wohl auch keinen Sinn. Oder ich versteh diesen nicht, was natürlich durchaus wahrscheinlich ist
  • schlechte Normalisierung. In 'einzelplanung' kommt immer wieder Dein Mustermann vor, hier wäre evtl. eine extra Personaltabelle sinnvoll und in 'einzelplanung' dann ein FK auf diese Personal-Tabelle
  • Deine 'monate' - Tabelle würde ich so gar nicht machen, aus einem Datum läßt sich immer berechnen, in welchem Monat / Halbjahr das ist
  • Dein VIEW "v_monatsstunden" ist meiner Meinung nach syntaktisch falsch: alle Spalten der Select-Liste müssen entweder in einer Aggregatsfunktion sein oder im GROUP BY auftauchen
  • in DATETIME-Feldern speicherst Du lediglich DATE
  • Dein Std_Mon_G im VIEW v_monatsstunden aggregiert offenbar alle Daten aus gesamtuebersicht, nicht nach Monaten aufgedröselt.

Ich bin mir nicht sicher, was total() macht, ich vermute sowas wie sum(), ist das korrekt?
 
Irknwie steig ich da nicht durch, mein PG akzeptiert das SQL leider auch nicht.
Ist ja auch SQLite nicht PG.

Jetzt zu Deinen Anmerkungen

Deine Tabelle 'gesamtuebersicht' wird durch einen TRIGGER befüllt, dieser arbeitet aber nur bei INSERT. Wenn Du in 'einzelplanung' was änderst / löscht, dann ist diese Tabelle natürlich Schrott. Ich denke, Du solltest aus dieser Tabelle einen VIEW machen.

Bisher hatte ich auch einen View. Der hat mir bei Aufruf beinahe den Rechner „blockiert“. Die Tabelle blockiert nur 1 x, Nachfolgende Einträge sind schnell über den Trigger verarbeitet.

warum der UNIQUE (bereich, Abteilung, name, vorname, EUR_Std, Std_Mon, Beginn, Ende) in 'einzelplanung'? Der macht zwar keinen Schaden, aber wohl auch keinen Sinn. Oder ich versteh diesen nicht, was natürlich durchaus wahrscheinlich ist

Dadurch werden Dubletten verhindert. Durch unsere interne Organsisation sind solche Dubletten ausgeschlossen. Außerdem siehe Oben.

schlechte Normalisierung. In 'einzelplanung' kommt immer wieder Dein Mustermann vor, hier wäre evtl. eine extra Personaltabelle sinnvoll und in 'einzelplanung' dann ein FK auf diese Personal-Tabelle

Stimmt. Ich arbeite direkt mit dem SQLite-Manager Mozilla. Kann also bei der Eingabe keine anderen Tabellen als Quelle verwenden. Ich selbst bekomme Informationen von verschiedenen Leuten, welche mit Datenbanken nichts am Hut haben. Auch erscheinen in den IST-Zahlungen die Kurzzeitbeschäftigten nicht so, wie über meinen Tisch gelaufen. Dafür habe ich mir in der Originaldatenbank einen View gebaut, welcher mir Name/Vorname-Kombinationen ausgibt, welche in meiner Plandatenbank und den Ist-Zahlen nicht identisch sind. Beispiel:

In einem Projekt soll ein Karl-Theodor zu Guttenberg beschäftigt werden. Ich gebe das O.K. für de Finanzierung. In der Personalabteillung wird dieser Kurzzeitbeschäftigte je nach Sachbearbeiter erfasst

  • Guttenberg Karl-Theodor zu
  • Guttenberg Karl-Theodor
  • zu Guttenberg Karl-Theodor
  • to be continued
Ich passe dann meine Tabelle Einzelplanung an und gut.


Deine 'monate' - Tabelle würde ich so gar nicht machen, aus einem Datum läßt sich immer berechnen, in welchem Monat / Halbjahr das ist

Die Tabelle gibt mir die Monate Zwischen Vertragsbeginn und Vertragsende heraus. Ich muss u.a. berechnen,

  • wer
  • wieviel
  • in welchem Monat kosten wird.

Ich hatte da einmal einen Thread gestartet, bin aber nicht weitergekommen.
https://www.datenbankforum.com/threads/monatserste-in-perioden-ermitteln.1373/

Dein VIEW "v_monatsstunden" ist meiner Meinung nach syntaktisch falsch: alle Spalten der Select-Liste müssen entweder in einer Aggregatsfunktion sein oder im GROUP BY auftauchen
in DATETIME-Feldern speicherst Du lediglich DATE

Vielleicht nicht elegant, aber der View liefert mir die Informationen, welche ich benötige.

DATETIME ist die einfachste Möglichkeit das Datum zu speichern. Der TIME-Teil kann unter den Tisch fallen. Die GUI bietet für Zeiten lediglich DATETIME an.

Dein Std_Mon_G im VIEW v_monatsstunden aggregiert offenbar alle Daten aus gesamtuebersicht, nicht nach Monaten aufgedröselt.

Ich wüde sagen schon. Er liefert mir die Summe aller Stunden über alle Verträge hinweg je Person und Monat. Unabhängig vom Vertrag.

Ich bin mir nicht sicher, was total() macht, ich vermute sowas wie sum(), ist das korrekt?

Korrekt total() ist nahezu wie sum(), bis auf den Unterschied:

The result of total() is always a floating point value. The result of sum() is an integer value if all non-NULL inputs are integers. If any input to sum() is neither an integer or a NULL then sum() returns a floating point value which might be an approximation to the true sum.


Sum() will throw an "integer overflow" exception if all inputs are integers or NULL and an integer overflow occurs at any point during the computation. Total() never throws an integer overflow.
 
Bisher hatte ich auch einen View. Der hat mir bei Aufruf beinahe den Rechner „blockiert“. Die Tabelle blockiert nur 1 x, Nachfolgende Einträge sind schnell über den Trigger verarbeitet.

Nun ja. Man sollte nicht an den Folgen von Fehlern rumdoktoren, sondern das Problem an sich abstellen. Über wie viele Datensätze reden wir?
Selbst Datenbanken für Hobbyköche (also MySQL) können mit einigen hundertausend Datensätzen flott umgehen.
Also, warum hat Dein View "bei Aufruf beinahe den Rechner „blockiert“." ?

Dadurch werden Dubletten verhindert. Durch unsere interne Organsisation sind solche Dubletten ausgeschlossen. Außerdem siehe Oben.

Eben.

Stimmt. Ich arbeite direkt mit dem SQLite-Manager Mozilla. Kann also bei der Eingabe keine anderen Tabellen als Quelle verwenden. Ich selbst bekomme Informationen von verschiedenen Leuten, welche mit Datenbanken nichts am Hut haben. Auch erscheinen in den IST-Zahlungen die Kurzzeitbeschäftigten nicht so, wie über meinen Tisch gelaufen. Dafür habe ich mir in der Originaldatenbank einen View gebaut, welcher mir Name/Vorname-Kombinationen ausgibt, welche in meiner Plandatenbank und den Ist-Zahlen nicht identisch sind. Beispiel:

In einem Projekt soll ein Karl-Theodor zu Guttenberg beschäftigt werden. Ich gebe das O.K. für de Finanzierung. In der Personalabteillung wird dieser Kurzzeitbeschäftigte je nach Sachbearbeiter erfasst

  • Guttenberg Karl-Theodor zu
  • Guttenberg Karl-Theodor
  • zu Guttenberg Karl-Theodor
  • to be continued
Ich passe dann meine Tabelle Einzelplanung an und gut.

Warum wird er 'erfaßt'?

Du gibst das ok für ihn. Damit z.B. auch eine Personalnummer. Die ist eindeutig, und die ist dann zu verwenden. Organisatorischer Fehler.
Es soll im übrigen öfters mal Kombinationen von Namen geben, die ähnlich klingen. In unserem 300-Seelen-Dorf für meinen Namen z.B. etwa 3.
Vermutlich werden also in Eurer Personalabteilung schon ab und an Leute falsch erfaßt & abgerechnet, oder?

DATETIME ist die einfachste Möglichkeit das Datum zu speichern. Der TIME-Teil kann unter den Tisch fallen. Die GUI bietet für Zeiten lediglich DATETIME an.

Dann taugt die GUI nicht, oder?

Korrekt total() ist nahezu wie sum(), bis auf den Unterschied:

The result of total() is always a floating point value. The result of sum() is an integer value if all non-NULL inputs are integers. If any input to sum() is neither an integer or a NULL then sum() returns a floating point value which might be an approximation to the true sum.


Sum() will throw an "integer overflow" exception if all inputs are integers or NULL and an integer overflow occurs at any point during the computation. Total() never throws an integer overflow.

Ähm, ja.

Andreas
 
Werbung:
Dann taugt die GUI nicht, oder?
Nun ja, das beste, was ich vewenden kann außer Access. Bei dem komme ich mit den MS-eigenen Formulierungen und den Klick-Umwegen nicht klar:p

Warum wird er 'erfaßt'?
Ich kann nur angeben, Geld für Dich vorhanden, für dich nicht vorhanden.
Die Personalabteilung vergibt eine Personalnummer, aber die ist so etwas von geheim .., Außerdem passiert es ständig, dass Personen aus diesem oder jenem Grund mehr als eine Personalnummer erhalten.

Hintergrund der ganzen Geschichte ist, ich bekomme für alle Kurzzeitbeschäftigen eine Rießentabelle mit allen Gehaltsbestandteilen. Die muss ich anteilig anhand der beantrageten Zeiten auf die einzelnen Bereiche/Abteilungen ... umlegen.
In der Leitungsebene herrscht Krieg. Das wir von den einzelnen Teilprojekten nicht die benötigen Daten bekommen, ist ein beliebter Nebenkriegsschauplatz.
Personalabteilung und Finanzabteilung brechen bis zu mir auf , darunter nicht mehr.

Es soll im übrigen öfters mal Kombinationen von Namen geben, die ähnlich klingen.
In meiner Straße wohnt jemand mit demselben Namen wie ich unsere Hausnummern bestehen aus denselben Ziffern nur in anderer Reihenfolge.
Das bedeutet für mich Handarbeit.

Durch unsere interne Organsisation sind solche Dubletten ausgeschlossen
Will heißen es gibt nie identische Einstellungen.

um wieviele geht es
Aktuell habe ich nur ca. 6000 Einstellungen in der Datenbank mit ca. 50 Untergliederungen. Wndere mich auch, aber der View schluckt bei jedem Aufruf viel Zeit.

Schönen Abend
Wolf-Tilmann
 
Zurück
Oben