cranach
Goto Top

Update-Anweisung in Access

Hallo,

Ich programmiere Game of Life mit Access.

Zellen, die sterben sollen stehen in der Query "die".
Nun muß ich in meiner Tabelle "zelle" den Zustand jener Zellen , die sterben sollen, auf "tot" setzen.
x,y sind Koordinaten der Zellen in "die" und in "zelle".

UPDATE zelle SET zelle.zustand = "tot"
WHERE zelle.x,zelle.y EXISTS (SELECT * FROM zelle AS z INNER JOIN die AS d ON (z.x=d.x AND z.y=d.y))

so oder ähnlich wird intuitiv die Anfrage lauten.

danke schon mal für eure Hilfe

Content-Key: 97990

Url: https://administrator.de/contentid/97990

Printed on: April 19, 2024 at 17:04 o'clock

Member: filippg
filippg Sep 28, 2008 at 01:39:14 (UTC)
Goto Top
Hallo,

und, was sagt er zu deinem "intuitiven" Ansatz?

Über die SQL-Fähigkeiten von Access bin ich mir ja nie ganz im klaren, aber in T-SQL (MS SQL Server) gäbe es wohl zwei Ansätze:

1. WHERE ... IN. Wie sieht's bei dir denn mit Primärschlüsseln aus? Die kann man eigentlich gut zusammensetzen (also x und y bilden den Schlüssel der Tabelle zelle), bei diesem Ansatz brauchst du aber einen einattributigen. Dann geht: UPDATE zelle SET... WHERE zelle.zelle_ID in (SELECT zelle.zelle_ID FROM zelle INNER JOIN die ON...)

2. Deutlich eleganter: Du kannst JOINS auch direkt in das Update-Statement einbauen. Grob: UPDATE zelle SET ... FROM zelle INNER JOIN die ON ... Zugegeben: ich muss die Ansätze auch immer erstmal ausprobieren, um zu sehen, ob sie funktionieren. Sollte es obiges (wider Erwarten) nicht tun würde ich ein UPDATE zelle SET ... FROM zelle LEFT JOIN die ON ...WHERE NOT die.x IS NULL probieren.

Gruß

Filipp
Member: cranach
cranach Sep 28, 2008 at 08:39:19 (UTC)
Goto Top
Hallo Filipp

schon mit dem einattributigen Primärschlüssel hat es funktioniert. Deine anderen Vorschläge habe ich noch nicht ausprobiert.

hast mein Restwochenende gerettet

Gruß
Member: cranach
cranach Sep 28, 2008 at 12:28:23 (UTC)
Goto Top
UPDATE zelle SET zelle.zustand = "tot"
WHERE zelle.id IN
(SELECT z.id FROM zelle AS z INNER JOIN die AS d ON z.x=d.x AND z.y=d.y);

So funktioniert es.

Ich habe eine weitere Frage...Kann ich die SELECT- Anweisung so erweitern, dass gleichzeitig tupel bezüglich einer dritten Tabelle "born" rausgeschmissen werden?
Weil ich nämlich in die Tabelle "zelle" Tupel aus "born" einfüge. Diese neuen Tupel dürfen aber bei der unteren Anweisung nicht involviert werden.

intuitiv:
(SELECT z.id FROM zelle AS z INNER JOIN die AS d ON z.x=d.x AND z.y=d.y)
MINUS
(SELECT z.id FROM zelle AS z INNER JOIN born AS b ON z.x=b.x AND z,y=b.y)

Danke

Gruß
Member: filippg
filippg Sep 28, 2008 at 12:46:16 (UTC)
Goto Top
Hallo,

ich habe nicht so ganz verstanden, was du willst. Aber vielleicht erfüllt
UPDATE zelle SET ... WHERE zelle.ID IN (SELECT.... JOIN die ON...) AND NOT zelle.ID IN (SELECT zelle.id FROM zelle INNER JOIN born ON...) deine Wünsche.

Gruß

Filipp
Member: cranach
cranach Sep 28, 2008 at 14:18:15 (UTC)
Goto Top
hallo Filipp

die= ermittelt die Tupel, deren Zustand in zelle auf "tot "gestzt werden müssen.
born= setzt den zustand auf "lebendig" ,wenn die tupel bereits in "zelle" sind, Oder fügt neue Tupel ein.

dieUPDATE und bornINSERT realisieren eben diese Aktualisierung in "zelle" anhand der Queries born und die.

Wenn ich bornQuery aufrufe verändert diese also "zelle".
Ich muß aber dieQuery auf die ursprüngliche "zelle" anwenden.
Deswegen dachte ich, ich könnte die neuen Tupel aus zelle wieder abziehen, so hätte ich ja die ursprüngliche zelle wieder und darauf "die" bzw. dieUPDATE ausführen.

Aaaber es geht nicht: Ich kann nicht verhindern, dass "dieQuery" auf die veränderte "zelle" angewendet wird.
müßte UPDATE und INSERT gleichzeitig laufen lassen, damit keiner von beiden früher zum Zuge kommt.

Da habe ich also den salat

Gruß

Ebru (mein wahres Ich)
Member: Biber
Biber Sep 28, 2008 at 16:23:53 (UTC)
Goto Top
Moin cranach/Ebru,

willkommen im Forum.
Wir können es handwerklich doch nur dann lösen, wenn wir alle erforderlichen Rahmenbedingungen Deiner Game-of-Life-Implementierung kennen.
Insbesondere fehlt mir die folgende Info:

Du hast nach einer Möglichkeit gefragt, alle vorhandenen Zellen auf Deinem Spielfeld (=komplette Tabelle "Zelle") per Update des Felds "Zustand" zu aktualisieren - allerdings nur auf den Zustand "tot". Was sind denn die anderen möglichen Zustände? Bzw. wäre es nicht einfacher, statt "UPDATE" ein DELETE From" zu nehmen?

müßte UPDATE und INSERT gleichzeitig laufen lassen, damit keiner von beiden früher zum Zuge kommt
Kann ich nicht nachvollziehen. Egal, ob Du es über eine Sequenz "DELETE died", danach "insert born" oder zuerst insert, dann delete machen würdest- NIEMALS kann eine Zelle(x,y) gleichzeitig/in der gleichen Generation in beiden Untermengen enthalten sein.

Es sei denn, Du hast es ganz anders implementiert...

Skizziere doch bitte kurz den Gesamtalgorithmus.

Danke
Biber