Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Spalten verbinden aus verschiedenen Zeilen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von PS-Frankenstein, 1 Januar 2020.

  1. PS-Frankenstein

    PS-Frankenstein Neuer Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    sollte einfach mit einem TRIGGER zu lösen sein.
     
    PS-Frankenstein gefällt das.
  3. akretschmer

    akretschmer Datenbank-Guru

    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?
     
  4. PS-Frankenstein

    PS-Frankenstein Neuer Benutzer

    Cool Danke, den Trigger kannte ich noch nicht.
    Klappt damit Super.
     
  5. akretschmer

    akretschmer Datenbank-Guru

    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
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden