Anmelden

View Full Version : SQL Update



KingofKning
11-06-11, 07:44
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

malzusrex
11-06-11, 09:52
Hallöchen,

ohne jetzt getestet zu haben in etwa so:


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

B.Hauser
11-06-11, 14:42
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:


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:

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

KingofKning
12-06-11, 08:44
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

Fuerchau
12-06-11, 19:13
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

KingofKning
13-06-11, 15:55
@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

Fuerchau
13-06-11, 19:24
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

KingofKning
14-06-11, 06:53
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