Inner Join mit MIN()

Lukas1979

Benutzer
Beiträge
10
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.
 
Werbung:
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=*#
 
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.
 
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
 
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.
 
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 ?
 
Werbung:
Zurück
Oben