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

Relationale Algebra in SQL transformieren

Dieses Thema im Forum "Andere Datenbankserver" wurde erstellt von avoli, 11 Mai 2017.

  1. avoli

    avoli Benutzer

    Nabend,
    bin Neuling in Sachen "Datenbanken" und bin gerade im Kapitel "Relationale Algebra". Dort gab es eine kleinere Übung die ich bearbeitet habe und wollte jetzt anschließend dies in SQL "umwandeln" um zu sehen, ob mir die richtigen Datensätze ausgespuckt werden. Folgendes liegt mir vor:

    ErsteR <- SELECT Dauer >= 5 (Tabelle2)
    ZwoteR<- (ErsteR Join ProjektNr = Projekt Nr Tabelle1)
    Resultat<- PROJEKTION Projektname(ZwoteR)

    Wie würde dies in SQL aussehen ?
    SELECT Projektname
    FROM Tabelle1
    (*???* Join Tabelle2 ON ProjektNr = ProjektNr)
    WHERE Dauer >=5

    Das war mein Ansatz. Über Hilfe würde ich mich sehr freuen! Schönen Abend noch =)
    Ps. Ich benutze MariaDB
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Wir können hier nur raten, was Du genau machen willst. Wenn Du eine DB hast, warum probierst Du es nicht mal selber aus? Ein PostgreSQL oder MariaDB ist schnell installiert, damit kann man schnell üben, testen, probieren. Das tut meist auch nicht weiter weh.
     
  3. avoli

    avoli Benutzer

    Wie ich bereits sagte, möchte ich dieses Relationale Datenmodell:
    in SQL abbilden.
    Na ich hatte doch vor es zu testen !? Ich habe doch geschrieben, dass ich das in SQl abbilden wollte, aber ich nicht genau weiß, wie ich das in SQL "übersetzen" kann! Darum bin ich doch hier...
     
  4. avoli

    avoli Benutzer

    So sehen die beiden Tabellen aus (links Tabelle1 und rechts Tabelle2):
    [​IMG]
    Die Tabellen habe ich schon samt Daten angelegt, das ist nicht das Problem.
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Sorry, ich kann damit nicht viel anfangen:

    Code:
    ErsteR <- SELECT Dauer >= 5 (Tabelle2)
    ZwoteR<- (ErsteR Join ProjektNr = Projekt Nr Tabelle1)
    Resultat<- PROJEKTION Projektname(ZwoteR)
    
    Daher hier mal in SQL (PostgreSQL):

    Code:
    test=# create table projekt_stammdaten(id serial primary key, name text);
    CREATE TABLE
    test=*# create table projekt_gearbeitet (id serial primary key, projekt int references projekt_stammdaten, gearbeitet_von_bis tsrange);
    CREATE TABLE
    test=*# insert into projekt_stammdaten values (1, 'Projekt 1');
    INSERT 0 1
    test=*# insert into projekt_stammdaten values (2, 'Projekt 2');
    INSERT 0 1
    test=*# insert into projekt_gearbeitet values (1, 1, '[2017-05-12 10:00:00,2017-05-12 14:00:00)');
    INSERT 0 1
    test=*# insert into projekt_gearbeitet values (2, 2, '[2017-05-11 09:00:00,2017-05-11 14:00:00)');
    INSERT 0 1
    test=*# insert into projekt_gearbeitet values (3, 2, '[2017-05-12 11:00:00,2017-05-12 13:00:00)');
    INSERT 0 1
    test=*# select projekt, sum(upper(gearbeitet_von_bis)-lower(gearbeitet_von_bis)) as arbeit_dauer from projekt_gearbeitet group by projekt;
     projekt | arbeit_dauer
    ---------+--------------
      1 | 04:00:00
      2 | 07:00:00
    (2 Zeilen)
    
    --
    -- als Join auf ein Subselect
    --
    
    test=*# select projekt_stammdaten.name, x.arbeit_dauer from projekt_stammdaten left join (select projekt, sum(upper(gearbeitet_von_bis)-lower(gearbeitet_von_bis)) as arbeit_dauer from projekt_gearbeitet group by projekt) x on projekt_stammdaten.id=x.projekt where x.arbeit_dauer > '05:00:00'::interval;
      name  | arbeit_dauer
    -----------+--------------
     Projekt 2 | 07:00:00
    (1 Zeile)
    
    
    --
    -- als JOIN direkt
    --
    test=*# select projekt_stammdaten.name, sum(upper(projekt_gearbeitet.gearbeitet_von_bis)-lower(projekt_gearbeitet.gearbeitet_von_bis)) as gesamtzeit from projekt_stammdaten left join projekt_gearbeitet on projekt_stammdaten.id = projekt_gearbeitet.projekt group by projekt_stammdaten.name having sum(upper(projekt_gearbeitet.gearbeitet_von_bis)-lower(projekt_gearbeitet.gearbeitet_von_bis)) > '05:00:00'::interval;
      name  | gesamtzeit
    -----------+------------
     Projekt 2 | 07:00:00
    (1 Zeile)
    
    Vielleicht hilft das Dir ja weiter.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Naja, da hatte ich die Tabellen ja halbwegs richtig erraten. Das anzupassen überlasse ich Dir zur Übung.
     
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