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

SQLite Update mit JOIN

Dieses Thema im Forum "SQLite" wurde erstellt von Wolf-Tilmann, 26 September 2013.

  1. Wolf-Tilmann

    Wolf-Tilmann Aktiver Benutzer

    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:
    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
     
  2. akretschmer

    akretschmer Datenbank-Guru


    Zeig bitte:
    • Deine Tabellen mit einigen wenigen Datensätzen
    • was Du haben willst
    • den Link zur Müllhalde
     
  3. ukulele

    ukulele Datenbank-Guru

    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 )
     
  4. Wolf-Tilmann

    Wolf-Tilmann Aktiver Benutzer

    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:

  5. akretschmer

    akretschmer Datenbank-Guru

    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?
     
  6. Wolf-Tilmann

    Wolf-Tilmann Aktiver Benutzer

    Ist ja auch SQLite nicht PG.

    Jetzt zu Deinen Anmerkungen

    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.

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

    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.


    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.
    http://www.datenbankforum.com/threads/monatserste-in-perioden-ermitteln.1373/

    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.

    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.

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

    akretschmer Datenbank-Guru

    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“." ?

    Eben.

    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?

    Dann taugt die GUI nicht, oder?

    Ähm, ja.

    Andreas
     
  8. Wolf-Tilmann

    Wolf-Tilmann Aktiver Benutzer

    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

    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.

    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.

    Will heißen es gibt nie identische Einstellungen.

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