Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Update mit select

Empfohlene Antworten

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

Leider funktioniert das (so) nicht..

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

bekommst du ergebnisse im subquery?

ist/sind "datumsfeld" im format DATE?

welches RDBMS?

s'Amstel

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

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

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

dieser subselect liefert keine datensätze, weil es falsch ist.

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

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

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

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.