Flons Geschrieben 15. Oktober 2007 Teilen Geschrieben 15. Oktober 2007 Hallo zusammen! Ich habe folgendes Problem, das auch durch eine Suche bisher nicht gelöst werden konnte: Ich habe eine Tabelle t1 In dieser stehen Wartungsdaten mit Datum In einer 2. Tabelle t 2 stehen ähnliche Datensätze mit ähnlichen Datumswerten. Nun kann es sein, daß die Daten aus t2 "aktueller" sind, dh. das Datumsfeld ist größer/höher/wieauchimmer. Beispiel: t1 Wartung1 27.04.2007 t2 Wartung1 17.08.2007 Nun möchte ich alle datensätze in t1 mit dem Datumswert aus t2 aktualisieren,wo das Datum aktueller ist. Gedacht hatte ich mir das ganze so: update t1 set t1.datumsfeld = t2.datumsfeld where ( SELECT t2.datumsfeld FROM t2 WHERE t1.spalte_a= t2.spalte_a and t1.spalte_b= t2.spalte_b and t1.spalte_c= t2.spalte_c and t1.datumsfeld < t2.datumsfeld ) Leider funktioniert das (so) nicht.. Wer kann mir helfen und weiß weiter?? Vielen Dank im Voraus. Gruß Flons Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 15. Oktober 2007 Teilen Geschrieben 15. Oktober 2007 Leider funktioniert das (so) nicht.. du kennst die antwort mancher darauf eh schon... bekommst du ergebnisse im subquery? ist/sind "datumsfeld" im format DATE? welches RDBMS? s'Amstel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
baba007 Geschrieben 15. Oktober 2007 Teilen Geschrieben 15. Oktober 2007 du kennst die antwort mancher darauf eh schon... bekommst du ergebnisse im subquery? ist/sind "datumsfeld" im format DATE? welches RDBMS? s'Amstel ich ich ich. FUNKTIONIERT NICHT, IST KEINE AUSREICHENDE FEHLERBESCHRIEBUNG !!! -Update table set table.xxx = table.yyy where (23.10.2007) wäre ein ergebnis und macht absolut keinen sinn. -select über 2 tabellen erfordert die einbindung von beiden. Auch dein DBMS hat eine Beschreibung versuch mal: update t1 set t1.date = (select max(t2.date) from t1,t2 where ...) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Flons Geschrieben 15. Oktober 2007 Autor Teilen Geschrieben 15. Oktober 2007 du kennst die antwort mancher darauf eh schon... bekommst du ergebnisse im subquery? ist/sind "datumsfeld" im format DATE? welches RDBMS? s'Amstel Sorry, ja ich hätte das ein bischen besser beschreiben sollen/können.. Also die verwendete DB ist eine Oracle XE. Die Subquery, also nur das Select- Statement, liefert etwa 220 Datensätze. Die möchte ich auch updaten. Führe ich das komplette Statement aber so aus, wie von mir beschrieben, gibt es die Meldung, ich nutze Hora6, das etwa 3300 Datensätze upgedatet werden sollen. Dies breche ich dann natürlich ab. Gruß Flons Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Flons Geschrieben 15. Oktober 2007 Autor Teilen Geschrieben 15. Oktober 2007 ich ich ich. -Update table set table.xxx = table.yyy where (23.10.2007) wäre ein ergebnis und macht absolut keinen sinn. Richtig, ich will ja alle updaten, wo das Datum in t2 größer ist als in t1... Dabei soll das Datum von t2 genommen werden, das zu dem Datensatz von t1 passt. -select über 2 tabellen erfordert die einbindung von beiden. Auch dein DBMS hat eine Beschreibung versuch mal: update t1 set t1.date = (select max(t2.date) from t1,t2 where ...) Ja, das klingt gut. Werde ich morgen mal testen. Vielen Dank. Gruß Flons Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
baba007 Geschrieben 15. Oktober 2007 Teilen Geschrieben 15. Oktober 2007 dieser subselect liefert keine datensätze, weil es falsch ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 15. Oktober 2007 Teilen Geschrieben 15. Oktober 2007 where ( SELECT t2.datumsfeld... WHERE? WHERE was? Du natürlich angeben, mit welchem Feld die Untermenge abgeglichen werden soll. In deinem Fall würde das so aussehen: WHERE t2.datumsfeld IN(SELECT ...) Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Flons Geschrieben 16. Oktober 2007 Autor Teilen Geschrieben 16. Oktober 2007 WHERE? WHERE was? Du natürlich angeben, mit welchem Feld die Untermenge abgeglichen werden soll. In deinem Fall würde das so aussehen: WHERE t2.datumsfeld IN(SELECT ...) Dim Hallo und danke, Dr. Dimitri... Das werde ich mal ausprobieren. Vielen Dank. Gruß Flons Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Flons Geschrieben 16. Oktober 2007 Autor Teilen Geschrieben 16. Oktober 2007 Da das Ändern anscheinend nicht mehr möglich ist, eine neue Antwort: WHERE? WHERE was? Du natürlich angeben, mit welchem Feld die Untermenge abgeglichen werden soll. In deinem Fall würde das so aussehen: WHERE t2.datumsfeld IN(SELECT ...) Dim Dies funktioniert so nicht, da: das Datumsfeld unbekannt ist. Mein Code: UPDATE zieltabelle v SET (v.dt_naechstewartung)= t.dt_naechstewartung WHERE t.dt_naechstewartung IN ( select t.dt_naechstewartung from quelltabelle t ,zieltabelle v where v.a = t.a and v.b = t.b and v.c = t.c and v.DT_NAECHSTEWARTUNG < t.DT_NAECHSTEWARTUNG ) Genaue Fehlermeldung: Ora-00904:"T"."DT_NAECHSTEWARTUNG" ungültiger Bezeichner Noch eine Idee? Einen anderen Lösungsvorschlag? Gruß Flons Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Flons Geschrieben 16. Oktober 2007 Autor Teilen Geschrieben 16. Oktober 2007 Hallo nochmals, nachdem ich nun auch noch anderweitig ein wenig informiert habe, habe ich eine Lösung mit PL/SQL gefunden: declare begin for vC_Daten in ( select v.i ,v.b ,v.DT_NAECHSTEWARTUNG ,t.dt_naechstewartung dt_naechstewartung_neu from zieltabelle v ,quelltabelle t where v.B = t.B and v.a = t.a and v.c = t.c and v.DT_NAECHSTEWARTUNG < t.DT_NAECHSTEWARTUNG ) loop dbms_output.put_line ( 'Geaendert wird I : ' ||';' ||to_char(vC_Daten.i) ||';' ||' DT_NaechsteWartung von : ' ||';' ||to_char(vC_Daten.dt_naechstewartung,'dd.mm.yyyy hh24:mi:ss') ||';' ||' auf : ' ||';' ||to_char(vC_Daten.dt_naechstewartung_neu,'dd.mm.yyyy hh24:mi:ss') ); update zieltabelle set dt_naechstewartung = vC_Daten.dt_naechstewartung_neu where i = vC_Daten.i; end loop; end; Danke noch einmal an alle für die Hilfe... Gruß Flons Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 16. Oktober 2007 Teilen Geschrieben 16. Oktober 2007 Stimmt, da hatte ich gestern auf die schnelle einen Denkfehler Jetzt mal ein ungetesteter Lösungsvorschlag: UPDATE zieltabelle v SET (v.dt_naechstewartung)= (select t.dt_naechstewartung from quelltabelle t where v.a = t.a and v.b = t.b and v.c = t.c and v.DT_NAECHSTEWARTUNG < t.DT_NAECHSTEWARTUNG) --Wertzuweisung WHERE v.a||v.b||v.c= (select t.a||t.b||t.c --Einschränkung der zu ändernden Werte ansonsten werden alle anderen auf NULL gesetzt from quelltabelle t where v.a = t.a and v.b = t.b and v.c = t.c and v.DT_NAECHSTEWARTUNG < t.DT_NAECHSTEWARTUNG) Wobei ich davon ausgehe, dass die Felder a,b und c den PK bilden und außerdem hoffe, dass sie nicht wirklich so heißen nachdem ich nun auch noch anderweitig ein wenig informiert habe, habe ich eine Lösung mit PL/SQL gefunden: Dann solltest Du diese Quelle(n) zukünftig meiden wie der Teufel das Weihwasser, denn als eine der obersten Regeln gilt: Implementiere nie, nie, nie etwas in PL/SQL was auch mit einem SQL Statement zu erreichen ist!! Hier übrigends noch der Link zum UPDATE Befehl. Was Du suchst nennt sich correlated subquery. Dim 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.