Zum Inhalt springen

Update mit select


Flons

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

du kennst die antwort mancher darauf eh schon... :D

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

du kennst die antwort mancher darauf eh schon... :D

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Stimmt, da hatte ich gestern auf die schnelle einen Denkfehler :rolleyes:

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

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