SQL Wie nach left join nur jede erste Zeile pro ID ausgeben?
Hallo,
ich habe das Problem , dass es nach einen join ( bei mir spezieller left join) logischer weise vorkommt , dass eine id mehrfach vorkommt.
Bsp
Tabelle Personal
Nr Name
- 1 max
- 2 moritz
- 3 struppi
Tabelle Aufgaben
Nr Aufgabe
- 1 putzen
- 1 abwaschen
- 1 irgendetwas
- 2 frage stellen
endtabelle
Nr Name Aufgabe
- 1 max putzen
- 1 max abwaschen
- 1 max irgendetwas
- 2 moritz frage stellen
- 3 struppi NULL
auf welche Art und Weise ist es nun möglich in der Endtabelle nur eine Zeile für Max zu haben statt der 3 so dass in der Endtabelle jede ID nur einmalig vorkommt. Verwendet wird Microsoft SQL
1 Antwort
Es ist an sich ja richtig, dass der Eintrag mehrfach vor kommt, aber ich denke das weißt du ja.
Eine Lösung für dein Problem wäre z.B. eine Gruppierung:
SELECT t1.ID, t1.Name, COUNT(t2.ID) As AnzahlAufgaben FROM tabelle1 t1 LEFT JOIN tabelle2 t2 ON t1.ID = t2.ID GROUP BY t1.ID, t1.Name
Solltest du jedoch jetzt pro Zeile die Aufgaben wissen wollen, wäre das eine andere Geschichte.
Verstehe, den 'Ersten Wert'. Das ist in der Regel ja garnicht mal so leicht.
Angenommen es sind 3 Tabellen:
Personen: wie deine Personen. (PersonID, PersonName)
PersonenAufgaben: Die Zwischentabelle mit den Relationen (PersonID, AufgabenID)
Aufgaben: Aufgaben (AufgabenID, AufgabeText)
Dann kannst du das so lösen, mit hilfe eines SubSelects im Join:
SELECT t1.PersonID, t1.PersonName, t3.AufgabeText FROM Personen t1 LEFT JOIN (Select PersonID, MIN(AufgabenID) As AufgabenID FROM PersonenAufgaben) t2 ON t1.PersonID = t2.PersonID INNER JOIN Aufgaben t3 ON t2.AufgabenID = t3.AufgabenID
Indem du die Zwischentabelle gruppierst, hast du genau hier die Option zu sagen: nur den Ersten wert (Also der niedrigste Wert = MIN) aus der Aufgaben-Tabelle.
danke für deine Antwort, ich will jedoch nicht die Anzahl der Aufgaben pro Person, sondern jeweils die erste Aufgabe namentlich darin stehen haben und die restlichen sollen im Resultat nicht angezeigt werden. Das ist nur ein Beispiel, eventuell nicht das Beste, meine eigentliche Konstruktion ist jedoch komplexer und da empfand ich so ein kleines Beispiel als überschaubarer.
Trotzdem nochmal Danke =)