Spalten verbinden aus verschiedenen Zeilen

PS-Frankenstein

Neuer Benutzer
Beiträge
2
Hallo,

ich bin aktuell etwas Hilflos, ich versuche möglichst einfach werte mit einander verknüpfen.

Ich habe eine MariaDB und habe in einer Tabelle die Spalten id,next_id,last_id,belegt,last_belegt,next_belegt, nun möchte ich relativ einfach, wenn der wert sich in belegt ändert, sich auch die werte in den anderen Zeilen ändert.
Also ich änder in der Zeile id=2 belegt auf 1. Nun soll in den Zeilen wo next_id=2 ist next_belegt auf 1 gehen und bei last genau so.

Oder lässt es sich einfach mit einer Abfrage lösen? Ich brauch als Endresultat eig nur eine Abfrage wo ich raus bekomme ob auch last und next belegt =0 ist.

Schönes Neues Jahr noch.

Grüße Dennis
 
Werbung:
Code:
 id | next_id | last_id | belegt | next_belegt | last_belegt
----+---------+---------+--------+-------------+-------------
  1 |       2 |         | f      | f           | f
  2 |       3 |       1 | f      | f           | f
  3 |       4 |       2 | f      | f           | f
  4 |       5 |       3 | f      | f           | f
  5 |       6 |       4 | f      | f           | f
  6 |         |       5 | f      | f           | f
(6 rows)
test=*# create or replace function update_frankenstein() returns trigger as $$begin update ps_frankenstein set next_belegt = true where id=new.last_id; update ps_frankenstein set last_belegt = true where id=new.next_id; return new; end; $$ language plpgsql;
CREATE FUNCTION
test=*# create trigger trigger_frankenstein after update on ps_frankenstein for each row when (old.belegt != new.belegt) execute procedure update_frankenstein();
CREATE TRIGGER
test=*# update ps_frankenstein set belegt = true where id = 3;
UPDATE 1
test=*# select * from ps_frankenstein order by id;
 id | next_id | last_id | belegt | next_belegt | last_belegt
----+---------+---------+--------+-------------+-------------
  1 |       2 |         | f      | f           | f
  2 |       3 |       1 | f      | t           | f
  3 |       4 |       2 | t      | f           | f
  4 |       5 |       3 | f      | f           | t
  5 |       6 |       4 | f      | f           | f
  6 |         |       5 | f      | f           | f
(6 rows)

test=*#

Paßt das?
 
Werbung:
Davon abgesehen ist der Aufwand natürlich recht hoch, es ginge einfacher. Demo:

Code:
test=*# drop table ps_frankenstein ;
DROP TABLE
test=*# create table ps_frankenstein (id int primary key, belegt bool default false);
CREATE TABLE
test=*# insert into ps_frankenstein (id) select s from generate_series(1,10) s;
INSERT 0 10
test=*# update ps_frankenstein set belegt = true where id = 5;
UPDATE 1
test=*# select id, belegt, case when lag(belegt) over (order by id) then true else false end as last_belegt, case when Lead(belegt) over (order by id) then true else false end as next_belegt from ps_frankenstein ;
 id | belegt | last_belegt | next_belegt
----+--------+-------------+-------------
  1 | f      | f           | f
  2 | f      | f           | f
  3 | f      | f           | f
  4 | f      | f           | t
  5 | t      | f           | f
  6 | f      | t           | f
  7 | f      | f           | f
  8 | f      | f           | f
  9 | f      | f           | f
 10 | f      | f           | f
(10 rows)

Vorteile:
  • man spart sich die ganzen Spalten
  • das funktioniert letztlich beim SELECT und damit immer
  • die TRIGGER-Lösung ist unvollständig, falls 'zwischendrin' später Datensätze gelöscht werden, müßte man die ganzen Pointer neu berechnen
 
Zurück
Oben