Wie füge ich in nächste freie Zeile der Spalte ein

Sagen wir es bestehen 10 Datensätze (ID 1-10), spalte 3 hat nur die ersten drei Datensätze gefüllt, die übrigen spalten(Spalte1,Spalte2) sind aber mehr gefüllt. Ich möchte ins nächste freie Feld (hier bei ID 4 ) von Spalte3 einen neuen Wert eingeben (aktuelleseingabewort). Mit der insert-Methode wird aber ein neuer Datensatz geschaffen (11. Datensatz), will ich aber nicht, sondern nur Spalte3 weiterauffüllen (fortlaufend). Ich weiß nicht, wie ich abfragen kann, welche ID-Nummer das Datenfeld hat, bei der die nächste freie Zeile in Spalte3 kommt. Hab recherchiert wie ein Blöder und komme nicht dahinter.
Hier meine stupid-Lösung, die natürlich alle freien Felder von Spalte3 mit „aktuelleseingabewort“ füllt, ich möchte es aber nur einmal haben und zwar in der folgenden freien Zeile der Spalte3:

„UPDATE TABELLE4 SET Spalte3 =’“ & aktuelleseingabewort & "’ „WHERE Spalte3 is null“

Moin, Rudolph

„UPDATE TABELLE4 SET Spalte3 =’“ & aktuelleseingabewort & "’

WHERE ID in (select ID from Tabelle4 where spalte3 is null)"

(nicht getestet)

Gruß Ralf

Hi Ralf und Rudolph,
so einfach ist das nicht, Deine Lösung macht (ungetestet) genau dasselbe.
Ihr müsstet sicherstellen, dass auch nur Spalte3 einer Zeile mit dem Inhalt geschrieben wird.
Benutzt eine Aggregatfunktion MAX() oder MIN() in dem SubSelekt von Ralf, denn das wars schon fast …

Gruß
Klaus

Getestet!
Moin, Klaus,

so wenig wie bei diesem Text habe ich selten verstanden.

Mein Beispiel ist inzwischen getestet und läuft in MS-Access:

 UPDATE Tabelle4 SET Spalte3 = "Filler"
 WHERE ID in 
 (select ID from Tabelle4 
 where Spalte3 is null);

Gruß Ralf

Hallo Ralf,

so wenig wie bei diesem Text habe ich selten verstanden.

Ich glaube Du hast das Problem falsch verstanden (oder ich bin’s, der nix versteht ?).

UPDATE Tabelle4 SET Spalte3 = „Filler“
WHERE ID in
(select ID from Tabelle4
where Spalte3 is null);

Das ist (wenn ID der Primärschlüssel ist) genau das gleiche wie

UPDATE Tabelle4 SET Spalte3 = "Filler"
WHERE Spalte3 is null;

Ich kenne die Access-Syntax nicht, aber der hier tut unter Oracle (ungetestet) das, von dem ich glaube dass es der OP braucht:

UPDATE Tabelle4 x SET Spalte3 = "Filler"
WHERE Spalte3 IS NULL AND
 NOT EXISTS (SELECT \* FROM Tabelle4 y
 WHERE Spalte3 IS NULL AND
 y.ID 
Gruß
Martin

Moin, Martin,

Ich glaube Du hast das Problem falsch verstanden (oder ich
bin’s, der nix versteht ?).

darüber ließe sich diskutieren, wenn wir wüssten, wo den OP der Schuh drückt :smile:

UPDATE Tabelle4 SET Spalte3 = „Filler“
WHERE ID in
(select ID from Tabelle4
where Spalte3 is null);

Das ist (wenn ID der Primärschlüssel ist) genau das gleiche
wie

UPDATE Tabelle4 SET Spalte3 = „Filler“
WHERE Spalte3 is null;

Ich kenne die Access-Syntax nicht, aber der hier tut unter
Oracle (ungetestet) das, von dem ich glaube dass es der OP
braucht:

UPDATE Tabelle4 x SET Spalte3 = „Filler“
WHERE Spalte3 IS NULL AND
NOT EXISTS (SELECT * FROM Tabelle4 y
WHERE Spalte3 IS NULL AND
y.ID

Das wäre nach meinem Verständnis Test der Update der Lücken in Spalte3 nach der ersten belegten und vor der nächsten belegten. Das kann aber niemand gewollt haben, oder?

Nebenbei: Access-SQL ist Standard-SQL.

Gruß Ralf

Hallo Ralf,

Ich glaube Du hast das Problem falsch verstanden (oder ich
bin’s, der nix versteht ?).

darüber ließe sich diskutieren, wenn wir wüssten, wo den OP
der Schuh drückt :smile:

Ruuuuuudooooolllllph!! :wink:

Das wäre nach meinem Verständnis Test der
Update der Lücken in Spalte3 nach der ersten belegten und vor
der nächsten belegten. Das kann aber niemand gewollt haben,
oder?

Das mit „vor der nächsten belegten“ streite ich einfach einmal ab. Das Statement füllt getesteterweise den ersten freien Wert in Spalte3. Das habe ich aus diesem Satz im OP herausgelesen:

Hier meine stupid-Lösung, die natürlich alle freien Felder
von Spalte3 mit „aktuelleseingabewort“ füllt, ich möchte es aber nur
einmal haben und zwar in der folgenden freien Zeile der Spalte3

Nebenbei: Access-SQL ist Standard-SQL.

Oracle aber bis vor kurzem nicht. Außerdem sehe ich bei Access immer Massen an eckigen Klammern und doppelten Anführungszeichen, und die wären mir im Standard zumindest in dieser Bedeutung noch nicht aufgefallen („filler“ ist z.B. lt. Standard was anderes als ‚filler‘). Kurz: Ich hab’ mit Access nix am Hut und daher auch keine Ahnung, was dort unterstützt wird und was nicht, es gibt soweit mir bekannt keine 100 %-ige Implementierung des ANSI- oder ISO-Standards, noch nicht einmal SQL:1999.

Gruß
Martin

Hi Martin,

Das Statement füllt getesteterweise den ersten freien Wert
in Spalte3.

Du hast recht.

Hier meine stupid-Lösung, die natürlich alle freien Felder
von Spalte3 mit „aktuelleseingabewort“ füllt, ich möchte es aber nur
einmal haben und zwar in der folgenden freien Zeile der Spalte3

Stimmt auch, hab das „nur einmal“ überlesen.

Außerdem sehe ich bei Access immer Massen an eckigen
Klammern und doppelten Anführungszeichen

eckige fummelt Access hinein, wenn Namen Leerzeichen enthalten, runde immer dann, wenn es generiert - keine Ahnung, wozu. Wenn ich SQL von Hand schreibe, geht es genauso gut ohne.

Einfache und doppelte Anführungsstriche werden gebraucht, wenn einer davon in Zeichenketten enthalten sind, dann dient jeweils der andere als Delimiter. Sonst ist mir da noch keine unterschiedliche Behandlung aufgefallen.

es gibt soweit mir bekannt keine 100 %-ige
Implementierung des ANSI- oder ISO-Standards, noch nicht
einmal SQL:1999.

Fehlen tut selten etwas bis auf ein paar exotische Forderungen, die eh keiner versteht. Es sind die Erweiterungen der Hersteller, die dem Entwickler das Leben schwermachen.

Gruß Ralf

Hallo Ralf,

Einfache und doppelte Anführungsstriche werden gebraucht, wenn
einer davon in Zeichenketten enthalten sind, dann dient
jeweils der andere als Delimiter.

…was mW nicht dem Standard entspricht.

es gibt soweit mir bekannt keine 100 %-ige
Implementierung des ANSI- oder ISO-Standards, noch nicht
einmal SQL:1999.

Fehlen tut selten etwas bis auf ein paar exotische
Forderungen, die eh keiner versteht. Es sind die Erweiterungen
der Hersteller, die dem Entwickler das Leben schwermachen.

Naja, das hier halte ich nicht für besonders exotisch:

INSERT INTO tablename
VALUES (0,'foo') , (1,'bar') , (2,'baz');

Geht aber unter Oracle und SybaseMSSQL trotzdem nicht… Für Oracle habe ich eine Dokumentation der voll/teilweise/nicht unterstützten Features von CORE SQL:2003 gefunden (http://download-east.oracle.com/docs/cd/B19306_01/se…). Da sind einige Leger drin, bei anderen Herstellern ist das sicher nicht anders.

Gruß
Martin

Moin, BC,

Naja, das hier halte ich nicht für besonders exotisch:

INSERT INTO tablename
VALUES (0,‚foo‘) , (1,‚bar‘) , (2,‚baz‘);

da darf ich Dir eine winzige Verbesserung vorschlagen:

INSERT INTO tablename (colname1, colname2, colname3)
VALUES (0,'foo') , (1,'bar') , (2,'baz');

Probier’s mal aus, unter Access flutscht es. Wenn ich auch immer noch nicht weiß, wozu ich das gebrauchen könnte :smile:

Gruß Ralf