sql >> Databáze >  >> RDS >> Mysql

Jak získat více záznamů proti jednomu záznamu na základě vztahu?

Původní otázka byla specifická pro databázi, ale možná je to dobré místo pro zahrnutí obecnější odpovědi. Je to častá otázka. Koncept, který popisujete, je často označován jako 'Skupinové zřetězení'. V SQL-92 nebo SQL-99 není žádné standardní řešení. Budete tedy potřebovat řešení specifické pro dodavatele.

  • MySQL - Použijte vestavěnou funkci GROUP_CONCAT. Ve vašem příkladu byste chtěli něco takového:
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 je nyní stejně jednoduchý, když je vestavěn string_agg (výraz, oddělovač). Tady je to s 'čárkou-mezera' mezi prvky:
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 starší než 9.0 vám umožňuje definovat vlastní agregační funkce pomocí CREATE AGGREGATE. O něco více práce než MySQL, ale mnohem flexibilnější. Podívejte se na tento jiný příspěvek Více podrobností. (Samozřejmě PostgreSQL 9.0 a novější mají tuto možnost také.)

  • Oracle - stejný nápad pomocí LISTAGG .

  • MS SQL Server - stejný nápad pomocí STRING_AGG

  • Záložní řešení - v jiných databázových technologiích nebo ve velmi starých verzích technologií uvedených výše nemáte tyto funkce zřetězení skupin. V takovém případě vytvořte uloženou proceduru, která vezme org_id jako svůj vstup a vydá zřetězená jména zaměstnanců. Potom použijte tuto uloženou proceduru ve svém dotazu. Některé z dalších odpovědí zde obsahují některé podrobnosti o tom, jak psát uložené procedury, jako jsou tyto.

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


  1. Cloud Vendor Deep-Dive:PostgreSQL na AWS Aurora

  2. Ukládání dat v MySQL jako JSON

  3. MySQL nedovolí přihlášení uživatele:Chyba 1524

  4. Získávání posledního záznamu z mysql