Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie erhält man mehrere Datensätze gegen einen Datensatz basierend auf einer Beziehung?

Die ursprüngliche Frage war datenbankspezifisch, aber vielleicht ist dies ein guter Ort, um eine allgemeinere Antwort einzufügen. Es ist eine häufige Frage. Das von Ihnen beschriebene Konzept wird häufig als „Gruppenverkettung“ bezeichnet. Es gibt keine Standardlösung in SQL-92 oder SQL-99. Sie benötigen also eine herstellerspezifische Lösung.

  • MySQL - Verwenden Sie die eingebaute GROUP_CONCAT-Funktion. In Ihrem Beispiel möchten Sie so etwas:
select 
  o.ID, o.Address, o.OtherDetails,
  GROUP_CONCAT( concat(e.firstname, ' ', e.lastname) ) as Employees
from 
  employees e 
  inner join organization o on o.org_id=e.org_id
group by o.org_id
  • PostgreSQL - PostgreSQL 9.0 ist jetzt genauso einfach, da string_agg(expression, delimiter) eingebaut ist. Hier ist es mit 'Komma-Leerzeichen' zwischen den Elementen:
select 
  o.ID, o.Address, o.OtherDetails,
  STRING_AGG( (e.firstname || ' ' || e.lastname), ', ' ) as Employees
from 
  employees e 
  inner join organization o on o.org_id=e.org_id
group by o.org_id

PostgreSQL vor 9.0 ermöglicht es Ihnen, Ihre eigenen Aggregatfunktionen mit CREATE AGGREGATE zu definieren. Etwas mehr Arbeit als MySQL, aber viel flexibler. Siehe dazu anderer Beitrag für mehr Details. (Natürlich haben PostgreSQL 9.0 und höher diese Option ebenfalls.)

  • Orakel - gleiche Idee mit LISTAGG .

  • MS SQL-Server - gleiche Idee mit STRING_AGG

  • Fallback-Lösung - In anderen Datenbanktechnologien oder in sehr sehr alten Versionen der oben aufgeführten Technologien haben Sie diese Gruppenverkettungsfunktionen nicht. Erstellen Sie in diesem Fall eine gespeicherte Prozedur, die die org_id als Eingabe verwendet und die verketteten Mitarbeiternamen ausgibt. Verwenden Sie dann diese gespeicherte Prozedur in Ihrer Abfrage. Einige der anderen Antworten hier enthalten einige Details darüber, wie gespeicherte Prozeduren wie diese geschrieben werden.

select 
  o.ID, o.Address, o.OtherDetails,
  MY_CUSTOM_GROUP_CONCAT_PROCEDURE( o.ID ) as Employees
from 
  organization o