simsalabim Geschrieben 20. Mai 2009 Teilen Geschrieben 20. Mai 2009 Hallo, ich bin gerade dabei einige Tabellen zu migrieren. Bisher lief alles ganz gut nach plan, aber heute bin ich auf folgendes problem gestossen, wo ich die Tabellen nicht einfach mit einem neuen Wert fpllen kann. Vielleicht kann mir jemand von euch bei der Syntax helfen. Also es geht um folgendes: gegeben ist eine Faktendatentabelle. In dieser Faktendatentabelle gibt es ein feld Sparte. Diese Sparte muss nun mit einem neuen Wert upgedatet werden. Nun das Problem. Das feld Sparte ist in abhängigkeit mit zwei weiteren felder zu sehen, dem feld Verkaufsorganisation und dem vertriebsweg. Diese felder gibt es dort aber nicht. Beispiel In der Faktentabelle gibt es die Sparte 03 Die Mappingtabelle schaut so aus VKORG VKWEG SPARTE_ALT SPARTE_neu 1600 23 3 400 2100 21 3 800 Nun kann ich ja nicht einfach den neuen Wert nehmen, da es zum einen ja zwei möglichkeiten gibt, und ich somit auch gar keine eindeutige beziehung herstellen kann. Meine Nächste Idee war, dieses über den Fremdschlüssel zu den Kopfdaten herszustellen. Denn dort gibt es wieder die felder VKOR, VKWEg, Sparte. Nur leider geht das auch nicht, da im Kopf abweichende Sparten gegenüber den Positionen stehen können. Wie schaffe ich , folgendes Skript update data.fakturapositionen set fpos_sparte = (select fkop_sparte from data.fakturakoepfe where fakturakoepfe.fkop_id = fakturapositionen.fpos_fkop_id) so zu erweiteren, dass bei Update die Felder VKORG und Vetriebsweg aus dem Kopf herangezogen werden, um die Sparte in den Positionen upzudaten. Wenn ich etwas zu kompliziert geschrieben habe, kann ichdas im verlauf vielleicht nochmal verdeutlichen. danke Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jeglalf Geschrieben 20. Mai 2009 Teilen Geschrieben 20. Mai 2009 Puhh, ich hoffe ich hab Dich da richtig verstanden. Beispiel: Kopf: FKopf (Kopf_ID, VKORG, VKWEG) Positionen: FPos (FPos_ID, FK_Kopf_ID, SpartePos) // FK_Kopf_ID ist der Fremdschlüssel der Kopf-Pos-Verknüpfung (1:n) Mapping: FMap (Map_VKORG, Map_VKWEG, Sparte_alt, Sparte_neu) ==> update FPos set SpartePos = (Select Sparte_neu from FKopf, FPos, FMap where FKopf.Kopf_ID = FPos.FK_Kopf_ID and FKopf.VKORG = FMap.Map_VKORG and FKopf.VKWEG = FMAP.Map_VKWEG and FPos.SpartePos = FMap.Sparte_alt) Je nach gewünschter Performance geht das dann noch über joins etwas besser, so kommt die Logik aber besser raus. Denke Performance ist nicht ganz so wichtig, da es ja eine einmalige geschichte ist. Voraussetzung ist natürlich ein eindeutiges mapping Hinweis: Eigentlich fasst man Faktentabellen möglichst wenig an, denn wenn Du versehentlich ein falsches Feld updatest, ist es Urkundenfälschung und das FA kann Dir mächtig an die Gurgel gehen^^ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
simsalabim Geschrieben 20. Mai 2009 Autor Teilen Geschrieben 20. Mai 2009 Hallo, vielen Dank für deine antwort. Also das fertige Skript mit meinen tabelle schaut so aus: update data.fakturapositionen set fpos_sparte=(Select Sparte_neu from data.fakturakoepfe fk, dawa.fakturapositionen fp, dawa.mig_sparte ms where fk.fkop_id = fp.fpos_fkop_id and fk.fkop_vkorg = ms.vkorg_alt and fk.fkop_vertriebsweg = ms.vertriebsweg_alt and fp.fpos_sparte = ms.sparte_alt); Jetzt habe ich nur das problem, dass der Select funktioniert, der Update aber mit folgender fehlermeldung abbricht: Unterabfrage für eine zeile liefert meher als eine Zeile Was mache ich falsch Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jeglalf Geschrieben 20. Mai 2009 Teilen Geschrieben 20. Mai 2009 (bearbeitet) Generell nichts, allerdings kann das Subselect theoretisch mehrere Ergebniszeilen je Sparte_neu liefern. Würde es natürlich aufgrund der realen Verknüpfungen nicht, das weiß aber das DBMS nicht. Man müsste also quasi die angebliche eindeutigkeit erzwingen. Versuchs mal entweder mit Select distinct Sparte_neu oder Select top 1 Sparte_neu oder Select Distinct Sparte_neu from (select sparte_neu from..... im Subselect Falls das nicht ausreicht zum überlisten könntest Du das Subselect mit Select into in eine neue Tabelle überführen und dann das update darauf aufsetzen. EDIT: Außerdem kannst du noch Funktionen, die eindeutige ergebnisse liefern probieren: max(Sparte_neu)... Bearbeitet 20. Mai 2009 von Jeglalf Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jeglalf Geschrieben 20. Mai 2009 Teilen Geschrieben 20. Mai 2009 Also, wenn ich mir das so anseh, macht eigentlich nur max() sinn, im Ergebnis also: update data.fakturapositionen set fpos_sparte=(Select max(Sparte_neu) from data.fakturakoepfe fk, dawa.fakturapositionen fp, dawa.mig_sparte ms where fk.fkop_id = fp.fpos_fkop_id and fk.fkop_vkorg = ms.vkorg_alt and fk.fkop_vertriebsweg = ms.vertriebsweg_alt and fp.fpos_sparte = ms.sparte_alt); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
simsalabim Geschrieben 20. Mai 2009 Autor Teilen Geschrieben 20. Mai 2009 Hallo, ich habe jetzt folgende Lösung versucht update (select * from data.fakturapositionen , data.fakturakoepfe where fkop_id = fpos_fkop_id) set fpos_sparte = (Select Sparte_neu from data.mig_sparte where fkop_vkorg = vkorg_alt and fkop_vertriebsweg = vertriebsweg_alt and fpos_sparte = sparte_alt); So müsste es auch gehen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.