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

Inner Join mit MIN()

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Lukas1979, 12 April 2017.

  1. Lukas1979

    Lukas1979 Benutzer

    Hallo zusammen,
    bin hier neu im Forum, ich bin der Lukas.

    Ich hab eine Frage an euch.

    Zwei Tabellen sollen Verknüpft werden. In der eine sind Einträge von Aufträgen enthalten (dbo.Buch). Jeder Auftrag kann mehrfach versendet werden. Jeder versendete Auftrag wird in einer weiteren Tabelle (dbo.Druck) gespeichert. Hierbei wird für die Zuordnung die ID des Auftrag aus Tabelle dbo.Buch in der Tabelle der gesendeten Aufträge gespeichert. U.a. enthält jeder gesendetet Auftrag ein Integer als Status.

    Ich möchte nun eine Abfrage die mir alle Einträge aus dbo.Buch bringt und daran Verknüpft den Eintrag aus der Tabelle dbo.Druck (dbo.Buch.ID = dbo.Druck.SatzID) dessen Status am kleinsten ist. Ist in dbo.Druck kein entsprechender Datensatz enthalten entsprechend leere Felder.

    Ich hab nun schon viel Versucht. Left Join, Inner Join. Grundsätzlich wollte ich hier mit der Tabellenfunktion MIN() arbeiten. Aber alles klappt nicht so recht.

    dbo.Buch
    ID Text
    1 Boden wischen
    2 Fenster putzen
    3 Treppen putzen
    4 Strasse kehren

    dbo.Druck

    ID SatzID Empfaenger Status
    1 1 Frau Hase 1
    2 1 Herr Wolff 0
    3 2 Frau Hase 2
    4 2 Herr Mueller 2
    5 2 Frau Pikton 1
    6 3 Frau Hase 5
    7 3 Frau Hase 3


    Das Ergebniss sollte so aussehen


    ID Text Status
    1 Boden wischen 0
    2 Fenster putzen 1
    3 Treppen putzen 3
    4 Strasse kehren NULL


    Es ist wichtig das der Eintrag "Strassen kehren" auch im Ergebniss enthalten ist.

    Kann mir jemand weiter helfen ?

    Danke schon mal.
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# select * from buch;
     id |  text   
    ----+----------------
      1 | boden wischen
      2 | fenster putzen
      3 | treppen putzen
      4 | straße kehren
    (4 Zeilen)
    
    test=*# select * from druck;
     id | satz_id |  wer  | status
    ----+---------+--------------+--------
      1 |  1 | frau hase  |  1
      2 |  1 | herr wolf  |  0
      3 |  2 | frau hase  |  2
      4 |  2 | herr mueller |  2
      5 |  2 | frau pikton  |  1
      6 |  3 | frau hase  |  5
      7 |  3 | frau hase  |  3
    (7 Zeilen)
    
    test=*# select * from buch b left join (select satz_id, min(status) from druck group by satz_id) d on b.id=d.satz_id;
     id |  text  | satz_id | min
    ----+----------------+---------+-----
      1 | boden wischen  |  1 |  0
      3 | treppen putzen |  3 |  3
      2 | fenster putzen |  2 |  1
      4 | straße kehren  |  |   
    (4 Zeilen)
    
    test=*#
    
     
  3. Lukas1979

    Lukas1979 Benutzer

    Danke das sieht sehr gut aus. Jetzt weiß ich nur nicht wo ich den Name für die Spalten angeben kann.

    Meldung 8155, Ebene 16, Status 2, Zeile 1
    Kein Spaltenname wurde für die Spalte 2 von 'd' angegeben.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    versuche mal, im select-teil alle spalten zu benennen. das * steht für meine Faulheit.
     
  5. Lukas1979

    Lukas1979 Benutzer

    Hab ich gemacht, aber keine änderung
     
  6. akretschmer

    akretschmer Datenbank-Guru

    *shrug*. Ich hab kein M$SQL.
     
  7. Lukas1979

    Lukas1979 Benutzer

    Ich probiere noch mal was. Hmm sind 131 Spalten.. Moment
     
  8. Lukas1979

    Lukas1979 Benutzer

    Ne weiß auch gerade nicht weiter.

    Z.b. :

    SELECT MIN(dbo.Druckdaten.Status) AS Status
    FROM dbo.Druckdaten
    WHERE SatzID = 69600

    geht ohne Probleme

    upload_2017-4-12_15-14-25.png
     
  9. ukulele

    ukulele Datenbank-Guru

    Die Fehlermeldung bezieht sich vermutlich auf die Spalte die den kleinsten Status enthällt. Mach mal aus
    Code:
    select * from buch b left join (select satz_id, min(status) from druck group by satz_id) d on b.id=d.satz_id;
    folgendes
    Code:
    select * from buch b left join (select satz_id, min(status) AS status from druck group by satz_id) d on b.id=d.satz_id;
    Außerdem sollte man natürlich in produktivem Code nicht mit SELECT * arbeiten sondern die Spalten klar ausschreiben.
     
  10. Lukas1979

    Lukas1979 Benutzer

    Hallo Ukulele,

    mach ich direckt morgen früh. Danke aber schon mal.
     
  11. Lukas1979

    Lukas1979 Benutzer

    Danke das klappt wunderbar.
    Ukulele, natürlich kommen da noch die richtigen Spaltenbezeichner rein.

    Danke euch für die Hilfe :)
     
  12. Lukas1979

    Lukas1979 Benutzer

    Eine Frage ist mir dann doch noch aufgekommen. Ist es möglich ein Standartwert mit anzugeben. Der entsprechend zurück gegeben wird, wenn in der Tabelle Druck kein Datensatz enthalten ist ?
     
  13. akretschmer

    akretschmer Datenbank-Guru

    Ja, dazu gibt es coalesce()

    Code:
    test=*# select coalesce(NULL, 'da ist nix');
      coalesce  
    ------------
     da ist nix
    (1 Zeile)
    
     
  14. Lukas1979

    Lukas1979 Benutzer

    Danke, muss ich mal schauen wo das in die Abfrage muss.
     
  15. ukulele

    ukulele Datenbank-Guru

    Bei MSSQL wäre das isnull(spalte,'Ersatzwert')
     
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