[NEWSboard IBMi Forum]

Thema: SQL Update

Hybrid View

  1. #1
    Registriert seit
    Aug 2006
    Beiträge
    2.114

    SQL Update

    Hallo *all,
    ich habe folgendes Problem:

    1 Datei mit mehreren Feldern, wichtig sind davon 2, 1 mal ein Indexfeld und einmal ein Datum Feld. Dummerweise ist das Datumsfeld nicht immer gefüllt so das die Datei wie folgt aussieht.

    Index Datum
    1___ 01.01.2011
    1___ 01.01.2011
    1___ 00.00.0000
    2___ 02.02.2011
    2___ 00.00.0000
    3___ 01.01.2011
    3___ 00.00.0000

    Das heißt ich muß mir den ersten Satz holen mit Datum = 00.00.0000 und dann der ersten Satz mit diesem Index wo das Datum gefüllt ist, und das dortige Datum in das Feld mit den 00.00.0000 schieben.
    Meine erste Idee ist eine View zu machen wo alle Nuller-Sätze drin sind und eine View wo alle nicht Nuller Sätze enthalten sind. Gibt es eine Alternative bzw. wie würdet ihr das lösen.
    Für Hinweise dankbar.

    GG

  2. #2
    Registriert seit
    May 2002
    Beiträge
    1.121
    Hallöchen,

    ohne jetzt getestet zu haben in etwa so:
    PHP-Code:
    Update MyFile a
    set FeldDatum 
    = (Select FeldDatum from MyFile b
                      where a
    .FeldIndex b.FeldIndex
                        
    and FeldDatum <> '00.00.0000' )
    where FeldDatum '00.00.0000' 
    Ich hoffe das hilft dir weiter
    Gruß
    Ronald

  3. #3
    Registriert seit
    Aug 2001
    Beiträge
    2.929
    So ganz trivial ist das nicht, da:
    sofern das Datum 00.00.0000 tatsächlich in dem Feld steht es sich um kein echtes Datumsfeld handelt, sondern entweder um ein alphanumerisches oder ein numerisches Feld (mit entsprechender Aufbereitung).
    Es könnten mehrere Sätze pro Index Null enthalten.
    Es könnten mehrere Sätze mit Datum pro Index vorhanden sein.
    Vermutlich soll dann das kleineste oder größte Datum (und nicht irgendein Datum) übernommen werden. Hier kommt erschwerend hinzu, dass das numerische bzw. alphanumerische Datum zunächst gedreht werden muss, um den kleinsten oder größten Wert zu ermitteln.

    Die Schritte sind also die folgenden:
    1. Für die einzelnen Indices muss zunächst das kleinste Datum, das nicht *ZEROS ist ermittelt werden. (geht man davon aus, dass es sich bei dem Datum um ein numerisches Datum in der Form TTMMJJJJ handelt, sieht das Select-Statement wie folgt aus:

    Code:
    Select Index,  
           Min(Substr(Digits(Numdate), 5) concat
              Substr(Digits(NumDate), 3, 2) concat
              Substr(Digits(NumDate), 1, 2))
    From MyTable
    Where NumDate <> 0
    Group By Index
    Diese "Zwischen-Tabelle" muss wieder mit der Original-Tabelle/Datei verknüpft werden, um das numerische Datum, das anstelle der *Zeros-Datums-Werte in die Datei übernommen werden soll.

    Das Ergebnis muss nun im Update-Statement verwendet werden.
    Setzt man alles zusammen, sieht das Ganze etwa so aus:
    Code:
    Update MyTable a
       set a.NumDate = (Select distinct NumDate
                           from (Select z.index, 
                                        Min(Substr(Digits(z.Numdate), 5)    concat 
                                            Substr(Digits(z.NumDate), 3, 2) concat 
                                            Substr(Digits(z.NumDate), 1, 2)) xDate
                                    from MyTable z
                                    Where z.NumDate <> 0
                                    Group By z.Index) x
                                 Join MyTable y on x.Index = y.Index
                                               and xDate   = Substr(Digits(y.Numdate), 5)    concat 
                                                             Substr(Digits(y.NumDate), 3, 2) concat 
                                                             Substr(Digits(y.NumDate), 1, 2)
                           Where a.Index = x.Index)
    where 	  a.NumDate = 0;
    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  4. #4
    Registriert seit
    Aug 2006
    Beiträge
    2.114
    Hallo,
    in diesem konkreten Beispiel ist es so das es sich um Positionen handelt, die pro Index alle das selbe Datum haben müßen. Das Datumsfeld ist Dezimal mit 6 Stellen. (Sorry mit den 6 Stellen war mir erst jetzt aufgefallen)

    Das heißt die Suche mit größer und kleiner kann ich mir sparen, und muß eigentlich nur den ersten Wert finden der <> Null ist.

    Es können mehrere Sätze mit einem Index Null-Datum haben.

    Aber der erste Vorschlag müßte doch schon greifen oder?
    Muß leider jetzt bis heute Abend zum Sport (Prüfung steht an) Werde aber mir das Morgen in aller Ruhe auf der Testumgebung ansehen.
    Ich liebe Feiertage.....

    Danke
    GG

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.699
    Dann ist es wirklich einfach:

    update mytable a
    set a.mydate= (select distinct b.mydate from mytable b
    where a.index = b.index and b.mydate <> 0)
    where a.mydate=0
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Aug 2006
    Beiträge
    2.114
    @fuerchau
    Tja,
    leider nicht so ganz, bekomme die Meldung
    "Nachrichten-ID . . . . : SQL0811 Bewertung . . . . . . : 30
    Nachrichtenart . . . . : Diagnose

    Nachricht . . . : Ergebnis der Anweisung enthält mehr als eine Zeile.
    Ursache . . . . : Die Ergebnistabelle einer Anweisung SELECT INTO, einer
    Unterabfrage oder einer Unterauswahl einer Anweisung SET enthält mehr als
    eine Zeile. Es handelt sich um Fehlerart 2. Bei Fehlerart 1 wurde von einer
    Anweisung SELECT INTO versucht, mehr als eine Zeile zurückzugeben. Bei
    Fehlerart 2 wurde durch eine Unterauswahl eines Basisprädikats mehr als eine "
    Das heißt in meinen Augen das der distinct nicht greift oder?

    Könnte mir ein group by helfen?

    GG

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.699
    Das bedeutet, dass dein Datum über mehrere Sätze eben nicht eindeutig ist.
    Ggf. hilft dir einfach "Max" oder "Min":

    update mytable a
    set a.mydate= (select min(b.mydate) from mytable b
    where a.index = b.index and b.mydate <> 0)
    where a.mydate=0
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  8. #8
    Registriert seit
    Aug 2006
    Beiträge
    2.114
    Danke,
    es ist wie immer wenn man doof ist. Hatte mich in meinem Query natürlich auf eine Firma beschränkt und im sql nicht. Man glaubt es kaum, aber kaum macht man es richtig läuft es auch......

    GG

Similar Threads

  1. SQL Update aus zwei Dateien mit 3 Schlüsselfeldern
    By mk in forum NEWSboard Programmierung
    Antworten: 13
    Letzter Beitrag: 13-07-12, 08:53
  2. SQL Update 2 Dateien
    By moskito in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 30-08-06, 17:30
  3. Update Syntax SQL
    By wuwu in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 18-07-06, 15:31
  4. SQL UPDATE, verknüpfung zweier Dateien
    By desti82 in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 04-07-06, 15:25
  5. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •