z.t.i Geschrieben 12. November 2009 Teilen Geschrieben 12. November 2009 Hallo, ich habe folgendes Problem: Ich habe zwei Tabellen rechnungen. Die eine ist aus der Migration und die andere aus der Produktion. Da die Rechnungssummen (ca. 900 Werte) der Tabelle Rechnungen im Produktion fehlerhaft sind, müssen die richtigen Werte aus der Migration ermittelt und diese in die Produktion eingepflegt werden. Dazu habe ich folgenden Statement aufgebaut: update Prod.rechnungen Produktion set Produktion.rechnungssumme=Migration.rechnungssumme from Prod.rechnungen Produktion inner join mig.rechnungen@mig Migration on (Migration.kunde_nr=Produktion.kunde_nr and Migration.rechnung_nr=Produktion.rechnung_nr and Migration.auftrag_nr=Produktion.auftrag_nr and Migration.objekt_nr=Produktion.objekt_nr and Migration.rechnung_gueltig_ab=Produktion.rechnung_ gueltig_ab) where Migration.rechnung_art='Einzug' and Migration.rechnung_historie='Aktuell' and Produktion.rechnung_hhistorie='Aktuell' and Migration.rechnungssumme!=Produktion.rechnungssumme Leider komme ich mit diesem Befehl nicht weiter, weil ich ein Syntaxfehler bzw. Gedankenfehler habe und dieser nicht ausführbar ist. Nun lautet meine Frage wie ich das am besten gelöst bekomme??? Bitte wirft ein Auge darauf. Ich versuche seit Tagen dieses Problem zu lösen, habs leider nicht geschafft!! Gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Daij Geschrieben 12. November 2009 Teilen Geschrieben 12. November 2009 ist das doppel h hier "and Produktion.rechnung_hhistorie='Aktuell'" gewünscht oder ein Fehler? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
z.t.i Geschrieben 12. November 2009 Autor Teilen Geschrieben 12. November 2009 Hi, nein gewollt ist das nicht ist ein Fehler von mir. Hab das wohl falsch herauskopiert. Muss "and Produktion.rechnung_historie='Aktuell' " heißen. Aber an dem Fehler liegt es nicht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
grueni Geschrieben 12. November 2009 Teilen Geschrieben 12. November 2009 1. Warum ein weiterer Thread? Das gleiche Problem hattest du letzte Woche doch schon? 2. Ich weiß zwar, daß es sich um Oracle 10g handelt (aus deinem anderen Thread), aber deshalb könntest du das trotzdem verraten. 3. Die genaue Fehlermeldung wär sicher interessant Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
z.t.i Geschrieben 12. November 2009 Autor Teilen Geschrieben 12. November 2009 Hi grueni, das stimmt. Das Problem hatte ich schon hier angesprochen. Aber da cihdachte dass es so lange her ist habe ich einen neuen Thread eröffnet. Sorry dass ich nicht erwähnt habe, dass ich mit Oracle 10 arbeite. Die Fehlermeldung lautet : ORA-00933: SQL-Befehl wurde nicht korrekt beendet Die Fehlermeldung taucht im from Klausel auf. Da ich nicht weiter komme lautet die Frage daher ob sie Syntax falsch ist??? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
grueni Geschrieben 12. November 2009 Teilen Geschrieben 12. November 2009 Ich bin mir grad nicht sicher, ob bei Oracle überhaupt eine FROM-Clause bei UPDATE zulässig ist. Ich glaub das muß man über Subqueries lösen. Ein Blick in die Oracle-Referenz bzw. eine Google-Suche nach Beispielen sollte dir das verraten. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
z.t.i Geschrieben 12. November 2009 Autor Teilen Geschrieben 12. November 2009 Hi grueni, über Subqueries habe ich das auch schon versucht aber nada.... Da bekam ich als Fehler, dass die Unterabfrage mehrere Zeilen enthält. Also ich verzweifle echt gerade... Und komme Leider gar nicht weiter... Im Moment scheint es so drehe ich mich echt im Kreis. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
grueni Geschrieben 12. November 2009 Teilen Geschrieben 12. November 2009 Wenn dir Oracle nur die Möglichkeit über Subqueries liefert, wirst du keine andere Wahl haben. Ich hab grad nicht die Zeit das nachzulesen. Ist es von der fachlichen Logik her überhaupt zulässig, daß man mehrere Datensätze erhält? Wenn ja, welche Rechnungssumme soll dann in die Produktivdatenbank geschrieben werden? Hast du schon versucht die Daten nur zu selektieren, also nur ein SELECT? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
z.t.i Geschrieben 12. November 2009 Autor Teilen Geschrieben 12. November 2009 Hi, Wenn dir Oracle nur die Möglichkeit über Subqueries liefert, wirst du keine andere Wahl haben. Ich hab grad nicht die Zeit das nachzulesen. Ist es von der fachlichen Logik her überhaupt zulässig, daß man mehrere Datensätze erhält? Wenn ja, welche Rechnungssumme soll dann in die Produktivdatenbank geschrieben werden? ja aus der Logik denke ich schon. Weil der ja in der Subquery, die Abfrage mit der Unterabfrage vergleicht und versucht diese zu ersetzen. Aus der Migration sollen alle korrekten Rechnungssummen selektiert und diese dann mit der falschen rechnungssummen in der Produktion ersetzt werden. Hast du schon versucht die Daten nur zu selektieren, also nur ein SELECT? Ja ich habe schon die Daten selektiert, welche die korrekten Werte enthalten. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
grueni Geschrieben 12. November 2009 Teilen Geschrieben 12. November 2009 Ich glaube du hast nicht verstanden, was ich (und in deinem letzten Thread dbwizard) dir sagen wollte. Also nochmal: Was soll passieren, wenn zu einer Rechnung in der Produktionsdatenbank nach deinen Einschränkungskriterien zwei Rechnungen aus der Migrationsdatenbank passen? Ich kenn deine konkreten Daten nicht, aber es sieht so aus als würdest du entweder nicht stark genug einschränken oder die Daten aus der Migrationsdatenbank sind nicht "sauber". Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
z.t.i Geschrieben 12. November 2009 Autor Teilen Geschrieben 12. November 2009 Hi, Ich glaube du hast nicht verstanden, was ich (und in deinem letzten Thread dbwizard) dir sagen wollte. Also nochmal: Was soll passieren, wenn zu einer Rechnung in der Produktionsdatenbank nach deinen Einschränkungskriterien zwei Rechnungen aus der Migrationsdatenbank passen? Ich kenn deine konkreten Daten nicht, aber es sieht so aus als würdest du entweder nicht stark genug einschränken oder die Daten aus der Migrationsdatenbank sind nicht "sauber". Also die passenden rechnungssummen sollen ignoriert werden. Nur die nicht passenden rechnungen müssen aus der Migration in die Produktion herbeigeführt werden. Ob die Migrationsdatenbank sauber ist kann ich nicht beurteilen. Ich weiß nur dass man da ordentlich Sch...ße gebaut wurde. (Sorry wegen dem Ausdruck) Bspw. Migration Kunde_nr 1 hat die rechnungssumme 1000 , in der Produktion steht ab bei der Kunde_nr 1 die rechnungssumme 1023 was eben falsch ist. Ich meine, dass ich die Einschränkungen eigentlich ordentlich durchgenommen habe. " migration.rechnungssume!= produktion.rechnungssumme " Bitte helft mir ich komme da echt nicht mehr weiter....:( Ich weiß dass ihr keinen Überblick auf meine Daten habt, aber eigentlich müsste mein Statement doch funktionieren. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
grueni Geschrieben 12. November 2009 Teilen Geschrieben 12. November 2009 ... Bspw. Migration Kunde_nr 1 hat die rechnungssumme 1000 , in der Produktion steht ab bei der Kunde_nr 1 die rechnungssumme 1023 was eben falsch ist. ... Und was soll passieren, wenn es zu Kunde_nr1 in der Migration die Rechnungssummen 1000 und 1100 vorhanden sind und in der Produktion steht 1023? Welcher Wert soll dann eingesetzt werden, die 1000 oder die 1100? Bei deinen Daten scheint sowas nämlich der Fall zu sein, deshalb meckert Oracle bei deinem Ansatz mit der Subquery. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
z.t.i Geschrieben 12. November 2009 Autor Teilen Geschrieben 12. November 2009 Hi grueni, danke für deine Mühe. Ich habe durch having count klausel heruafinden können, dass ich tatsächlich Daten habe die doppelt vorkommen. Bspw. kunde_nr 1 mit der rechnung_nr 1 hat die rechnungssumme 10020 und kunde_nr 1 mit der rechnung_nr 2 hat ebenfalls die rechnungssumme 10020. Irgendwie muss ich dieses Problem lösen. Daher habe ich überlegt den distinct anzuwenden. Dann habe ich eines von beiden schon upgedatet. Danach dürfte (nach dem Update) dieses Problem für doppelte Einträge nicht mehr vorkommen, da der eine ja nicht mehr dem Kriterium "Migration.rechnungssumme!=Produktion.rechnungssumme" entspricht. Dieses Vorgehen wiederhole ich dann solange bis alles upgedatet ist. Müsste doch so gehen oder grueni??? Weil die ermitteleten Werte sind schon richtig. Gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
z.t.i Geschrieben 13. November 2009 Autor Teilen Geschrieben 13. November 2009 Guten Morgen grueni, auf ein Neues. Ich habe genau das Problem, was du mir gestern zugeschrieben hast. Mit distinct wird das nicht lösbar sein. Ich habe noch etwas nachgebohrt und habe folgendes erarbeitet. Meine Abfrage: update Prod.Rechnungen Produktion set Produktion.rechnung_summe=nvl(( select Migration.rechnung_summe from Mig.Rechnungen Migration, Prod.Rechnungen@Prod Produktion where Migration.rechnung_art='Einzug' and Migration.kunde_nr=Produktion.kunde_nr and Migration.rechnung_nr=Produktion.rechnung_nr and Migration.auftrag_nr=Produktion.auftrag_nr and Migration.objekt_nr=Produktion.objekt_nr and Migration.vertrag_nr=1 and Migration.rechnung_gueltig_ab=Produktion.rechnung_ gueltig_ab and Migration.rechnung_historie='Aktuell' and Produktion.rechnung_hhistorie='Aktuell' and Migration.rechnung_summe!=Produktion.rechnung_summ e),0) Und zwarhabe ich folgenden Fall. Ich habe einen Kunden mit der kunde_nr=1 der 2 Verträge hat. Kunde_nr=1 mit Vertrag_nr=1 hat rechnungssumme=12000 und ebenfalls hat der Kunde_nr=1 mit Vertrag_nr=2 die rechnungssumme=8500. Daher habe ich folgende Änderung in die Abfrage eingabaut: and Migration.vertrag_nr=1. s. o. Wäre meine hier dargestellte Abfrage so korrekt??? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
grueni Geschrieben 13. November 2009 Teilen Geschrieben 13. November 2009 Es klingt vielversprechend, aber ohne die konkreten Tabellen und ohne Kenntnisse über die fachliche Logik kann man (bzw. zumindest ich) das nicht genau sagen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
z.t.i Geschrieben 13. November 2009 Autor Teilen Geschrieben 13. November 2009 Hey grueni, danke das du mir antwortest. Im Moment fäält mir auch nichts mehr ein ich werde das mal versuchen. Es ist zwar nicht die beste Lösung aber naja. Hauptsache ich verliere dadurch keine Daten. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
z.t.i Geschrieben 13. November 2009 Autor Teilen Geschrieben 13. November 2009 Hi, hat leider nicht funktioniert. Ich habe die gleiche Fehlermeldung wie eben: "ORA-01427: Unterabfrage fur eine Zeile liefert mehr als eine Zeile". Gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_n4p_ Geschrieben 13. November 2009 Teilen Geschrieben 13. November 2009 update Prod.Rechnungen Produktion set Produktion.rechnung_summe=nvl(( select Migration.rechnung_summe from Mig.Rechnungen Migration, Prod.Rechnungen@Prod Produktion where Migration.rechnung_art='Einzug' and Migration.kunde_nr=Produktion.kunde_nr and Migration.rechnung_nr=Produktion.rechnung_nr and Migration.auftrag_nr=Produktion.auftrag_nr and Migration.objekt_nr=Produktion.objekt_nr and Migration.vertrag_nr=1 and Migration.rechnung_gueltig_ab=Produktion.rechnung_ gueltig_ab and Migration.rechnung_historie='Aktuell' and Produktion.rechnung_hhistorie='Aktuell' and Migration.rechnung_summe!=Produktion.rechnung_summe),0) bist du sicher das du so ein update machen möchtest? also selbst wenn dein subquery nur den geforderten einen wert zurückgibt.. was passiert denn dann? angenommen subquery liefert 11322 ließt sich dein update so: update Prod.Rechnungen Produktion set Produktion.rechnung_summe=nvl(113322,0) also in einigen anderen datenbanken hätte ich jetzt wohl n problem... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
z.t.i Geschrieben 13. November 2009 Autor Teilen Geschrieben 13. November 2009 Hi _n4p_, und wie köönte man dann vorgehen??? Du meinst nvl wäre nicht gerade hilfreich, aber ich komme ja gar nicht dazu einen Update zu starten, weil ich ständig diese Fehlermeldung habe. Ich habe auch schon folgendes versucht: Das habe ich im Inet gefunden. Soll für das gleiche Problem weitergeholfen haben. Aber bei mir geht das auch nicht. Ich kann das zwar ausführen, aber irgendwie landet das ins echo oder so, weil der Compiler nach ca 9 sec durch ist, und nichts tut. update Prod.Rechnungen Produktion set Produktion.rechnung_summe=( select Migration.rechnung_summe from Mig.Rechnungen Migration, Prod.Rechnungen@Prod Produktion where Migration.rechnung_art='Einzug' and Migration.kunde_nr=Produktion.kunde_nr and Migration.rechnung_nr=Produktion.rechnung_nr and Migration.auftrag_nr=Produktion.auftrag_nr and Migration.objekt_nr=Produktion.objekt_nr and Migration.vertrag_nr=1 and Migration.rechnung_gueltig_ab=Produktion.rechnung_ gueltig_ab and Migration.rechnung_historie='Aktuell' and Produktion.rechnung_hhistorie='Aktuell' and Migration.rechnung_summe!=Produktion.rechnung_summe) where vertrag_nr=(Select vertrag_nr from mig.Rechnungen Migre where Produktion.vertrag_nr=Migre.vertrag_nr) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_n4p_ Geschrieben 13. November 2009 Teilen Geschrieben 13. November 2009 (bearbeitet) nein ich meine nich nvl, ich meine das update ^^ du schränkst das update in keiner weise ein. was zur folge hat das du in ALLEN datensätzen rechnung_summe mit EINEM wert überschreibst, was wohl nicht der sinn war. das was du da versuchst kann afaik MSSQL mit einem "JOIN" auf die update tabelle, so wie dein erster Post UPDATE table SET feld = ? FROM table2 WHERE feld2 = ? ... naja 9 sekunden, kommt drauf an wie groß die tabellen sind, wenn er "nichts tut" würde ich mal schätzen das die kriteren nicht passen. ich persönlich würde mit nem cursor drüberlaufen bevor ich noch paar stunden rumgoogle ^^ dumme frage, was macht die datensätze in den tabellen eigentlich eindeutig? rechnungsnummer? grob gesagt: cursor holt alle datensätze aus migration bei denen rechnungssumme ungleich rechnungssumme des passenden datensatzes aus produktion ist. für jede vom cursor geliferte zeile update produktion set rechnungssumme = cursorzeile.rechnungssumme WHERE rechnungsnummer = cursorzeile.rechnungsnummer oder was immer die datensätze eindeutig macht sicher mag es ein ALL-IN-ONE query geben das dein problem erledigt. aber son cursor is in 15 minuten fertig. Bearbeitet 13. November 2009 von _n4p_ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
z.t.i Geschrieben 13. November 2009 Autor Teilen Geschrieben 13. November 2009 (bearbeitet) Hi , Danke für den Tipp. Ich kenne mich Leider mit Cursor nicht aus. Muss mir das mal im inet anschauen. Danek nochmals. Gruß Bearbeitet 13. November 2009 von z.t.i 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.