MS Access SQL: 1:n Beziehung in einer Zeile darstellen
Grimm Hasuki
- datenbank
- sql
Hallo,
Habe diese Frage schonmal (aber sehr sehr oberflächlich) gestellt.
Sagen wir ich habe zum Beispiel eine Tabelle
Teilnehmer
welche mit einerID
mit einer anderen TabelleBestellteProdukte
verknüpft wurde.
Tabelle "Teilnehmer" =
Id | Name |
---|---|
1 | Max Mustermann |
2 | Karl Müller |
3 | Linda Schuhmacher |
Und eine Tabelle "BestellteProdukte" =
Id | Bestellung |
---|---|
1 | Toaster |
1 | Spühle |
1 | Hammer |
3 | Kühlschrank |
Mein SQL wäre jetzt
SELECT Teilnehmer.*,BestelltePrukte.Bestellung
FROM Teilnehmer INNER JOIN BestellteProdukte ON Teilnehmer.ID = BestellteProdukte.ID;
Woraus ich diese Tabelle erhalten sollte.
ID | Name | Bestellung |
---|---|---|
1 | Max Mustermann | Toaster |
1 | Max Mustermann | Spüle |
1 | Max Mustermann | Hammer |
2 | Karl Müller | |
3 | Linda Schuhmacher | Kühlschrank |
Das gewünschte Format wäre aber nur eine Zeile pro ID zu haben, also die verschiedenen Bestellungen welche auf die ID verknüpft wurden in einer Zeile darzustellen und diese mit z.B. "," zu separieren. | ||
In diesem Format: |
||
ID | Name | Bestellung |
--- | --- | --- |
1 | Max Mustermann | Toaster, Spüle, Hammer |
2 | Karl Müller | |
3 | Linda Schuhmacher | Kühlschrank |
Die Frage wäre also ob dies in einem SQL in MC Access möglich ist und wenn ja wie 😀. | ||
Verzeihung wenn ich etwas unverständlich aufgezeigt haben sollte(bin nicht oft auf solchen Foren unterwegs.) |
Hallo Grimm,
danke für die Klarstellung.
(1) Für Karl Müller brauchst Du einen LEFT JOIN, keine INNER JOIN. Denn Du möchtest Sätze aus der linken Tabelle auch dann haben, wenn die rechte Tabelle keinen Eintrag hat.
(2) Für die Kommaseparierung musst Du die Doku von MS Access (das meinst Du sicherlich, ich wüsste nicht was MC Access ist) durchflöhen, ob es dafür eine Funktion gibt. Standard-SQL ist das nicht, ich kenne keine solche Funktion.
Rolf
Hallo Rolf,
Danke erstmal für die Antwort, das mit dem Left Join löst schonmal eines meiner Probleme vielen Dank :D.
Gäbe es denn dann eine Möglichkeit meine gewünschte Ansicht zu bekommen, wenn ich dies nicht in dem "MS Access SQL" sondern in einem "Standard-SQL" löse?
Hallo
Hallo Rolf,
Danke erstmal für die Antwort, das mit dem Left Join löst schonmal eines meiner Probleme vielen Dank :D.
Gäbe es denn dann eine Möglichkeit meine gewünschte Ansicht zu bekommen, wenn ich dies nicht in dem "MS Access SQL" sondern in einem "Standard-SQL" löse?
In MS SQL (ab MS SQL Server 2017) und auch in MySQL (mindestens seit Version 5.5) gibt es die Funktion CONCAT_WS, die als Parameter angegebene Strings mit einem als erstem parameter angegebenen Separator zusammenfügt. Ob man die Parameterliste mit einer Abfrage füttern kann, wäre zu ermitteln.
Tschö, Auge
In MS SQL (ab MS SQL Server 2017) und auch in MySQL (mindestens seit Version 5.5) gibt es die Funktion CONCAT_WS, die als Parameter angegebene Strings mit einem als erstem parameter angegebenen Separator zusammenfügt.
Ich würde eher direkt zu group-concat (mysql), STRING_AGG (mssql) bzw. string_agg (postgresql) greifen.
Hallo
In MS SQL (ab MS SQL Server 2017) und auch in MySQL (mindestens seit Version 5.5) gibt es die Funktion CONCAT_WS
Ich würde eher direkt zu group-concat (mysql), STRING_AGG (mssql) bzw. string_agg (postgresql) greifen.
Stümmt. Sieht beim ersten querlesen passender aus.
Tschö, Auge
Hallo Auge,
CONCAT will einzelne Strings, aber du hast mich auf die Lösung gebracht.
Was hier gebraucht wird ist eine Aggregationsfunktion. Und da bin ich bei GROUP_CONCAT fündig geworden
Rolf
Hallo
CONCAT will einzelne Strings, aber du hast mich auf die Lösung gebracht.
Ich war mir beim „schnell mal“ suchen nicht sicher, ob die Funktion nicht auch eine Abfrage, die die Werteliste generiert, akzeptiert. IN
kann das ja auch. Wenn sie das aber nicht kann, passt die Funktion natürlich nicht zur gestellten Aufgabe.
Was hier gebraucht wird ist eine Aggregationsfunktion. Und da bin ich bei [GROUP_CONCAT]https://dev.mysql.com/doc/refman/5.6/en/group-by-functions.html#function_group-concat) fündig geworden
erwin auch. 😀
Tschö, Auge
Hallo Auge,
erwin auch
das kommt davon, wenn man zu Antworten beginnt, währenddessen was anderes erledigen muss und dann sendet ohne nochmal nachzulesen ob einer reingegrätscht ist.
Rolf