Join fachinformatiker.de Forum Now
Ergebnis 1 bis 11 von 11

Update mit select

Diskussion über Update mit select in Datenbanken der Kategorie Fachliches; Hallo zusammen! Ich habe folgendes Problem, das auch durch eine Suche bisher nicht gelöst werden konnte: Ich habe eine Tabelle ...

  1. #1
    Reg.-Benutzer
    Reg.-Datum
    27.12.2004
    Beiträge
    158

    Standard Update mit select

    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:
    Code:
    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

    Fachinformatiker Anwendungsentwicklung

  2. #2
    Moderator Linux + Unix
    Rootserver - Vserver - Webspace
    Avatar von Amstelchen
    Reg.-Datum
    08.03.2005
    Ort
    127.0.0.1
    Beiträge
    3.948

    Standard

    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
    Help stamp out and abolish redundancy!
    Help stamp out and abolish redundancy!

  3. #3
    Reg.-Benutzer Avatar von baba007
    Reg.-Datum
    07.05.2004
    Ort
    da hinten Links
    Beiträge
    1.518

    Standard

    Zitat Zitat von Amstelchen Beitrag anzeigen
    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 ...)
    Geändert von baba007 (15.10.2007 um 18:32 Uhr)
    Zitat Zitat von perdi
    "Haben Sie Inhalt in Ihrer Präsentation oder verwenden Sie PowerPoint?"
    Echte Männer essen keinen Honig - Echte Männer kauen Bienen!
    Zitat Zitat von RFC2795
    "Auf der Suche nach dem Richtigen kann man viel Spass mit den Falschen haben!"

  4. #4
    Reg.-Benutzer
    Reg.-Datum
    27.12.2004
    Beiträge
    158

    Standard

    Zitat Zitat von Amstelchen Beitrag anzeigen
    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
    Fachinformatiker Anwendungsentwicklung

  5. #5
    Reg.-Benutzer
    Reg.-Datum
    27.12.2004
    Beiträge
    158

    Standard

    Zitat Zitat von baba007 Beitrag anzeigen
    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.
    Zitat Zitat von baba007 Beitrag anzeigen
    -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
    Fachinformatiker Anwendungsentwicklung

  6. #6
    Reg.-Benutzer Avatar von baba007
    Reg.-Datum
    07.05.2004
    Ort
    da hinten Links
    Beiträge
    1.518

    Standard

    dieser subselect liefert keine datensätze, weil es falsch ist.
    Zitat Zitat von perdi
    "Haben Sie Inhalt in Ihrer Präsentation oder verwenden Sie PowerPoint?"
    Echte Männer essen keinen Honig - Echte Männer kauen Bienen!
    Zitat Zitat von RFC2795
    "Auf der Suche nach dem Richtigen kann man viel Spass mit den Falschen haben!"

  7. #7
    Reg.-Benutzer
    Reg.-Datum
    04.02.2007
    Ort
    Nähe München, Ndb
    Beiträge
    1.265

    Standard

    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:

    Code:
     WHERE t2.datumsfeld IN(SELECT ...)
    Dim

  8. #8
    Reg.-Benutzer
    Reg.-Datum
    27.12.2004
    Beiträge
    158

    Standard

    Zitat Zitat von dr.dimitri Beitrag anzeigen
    WHERE? WHERE was?
    Du natürlich angeben, mit welchem Feld die Untermenge abgeglichen werden soll. In deinem Fall würde das so aussehen:

    Code:
     WHERE t2.datumsfeld IN(SELECT ...)
    Dim
    Hallo und danke, Dr. Dimitri...
    Das werde ich mal ausprobieren.
    Vielen Dank.
    Gruß
    Flons
    Fachinformatiker Anwendungsentwicklung

  9. #9
    Reg.-Benutzer
    Reg.-Datum
    27.12.2004
    Beiträge
    158

    Standard

    Da das Ändern anscheinend nicht mehr möglich ist, eine neue Antwort:
    Zitat Zitat von dr.dimitri Beitrag anzeigen
    WHERE? WHERE was?
    Du natürlich angeben, mit welchem Feld die Untermenge abgeglichen werden soll. In deinem Fall würde das so aussehen:

    Code:
     WHERE t2.datumsfeld IN(SELECT ...)
    Dim
    Dies funktioniert so nicht, da:
    das Datumsfeld unbekannt ist.
    Mein Code:
    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
    Fachinformatiker Anwendungsentwicklung

  10. #10
    Reg.-Benutzer
    Reg.-Datum
    27.12.2004
    Beiträge
    158

    Standard Gelöst mit PL/SQL

    Hallo nochmals,
    nachdem ich nun auch noch anderweitig ein wenig informiert habe, habe ich eine Lösung mit PL/SQL gefunden:

    Code:
    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
    Fachinformatiker Anwendungsentwicklung

  11. #11
    Reg.-Benutzer
    Reg.-Datum
    04.02.2007
    Ort
    Nähe München, Ndb
    Beiträge
    1.265

    Standard

    Stimmt, da hatte ich gestern auf die schnelle einen Denkfehler
    Jetzt mal ein ungetesteter Lösungsvorschlag:
    Code:
    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

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. MS Access SQL Fehler
    Von kills im Forum Datenbanken
    Antworten: 3
    Letzter Beitrag: 18.05.2004, 16:34
  2. Antworten: 4
    Letzter Beitrag: 26.04.2004, 17:24
  3. Datenanalyse mit MySQL
    Von etops im Forum Datenbanken
    Antworten: 7
    Letzter Beitrag: 05.12.2003, 12:41
  4. Mein Programm hängt
    Von BMAS im Forum Java
    Antworten: 29
    Letzter Beitrag: 14.08.2002, 09:58
  5. Kleines Problem mit JDBC
    Von BMAS im Forum Java
    Antworten: 6
    Letzter Beitrag: 28.06.2002, 09:18