Zum Inhalt springen

SQL Problem


simsalabim

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Jeglalf
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...