Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como obter vários registros em um registro com base na relação?


A pergunta original era específica do banco de dados, mas talvez este seja um bom lugar para incluir uma resposta mais genérica. É uma pergunta comum. O conceito que você está descrevendo é frequentemente chamado de 'Concatenação de Grupo'. Não há solução padrão no SQL-92 ou SQL-99. Portanto, você precisará de uma solução específica do fornecedor.
  • MySQL - Use a função GROUP_CONCAT integrada. No seu exemplo, você desejaria algo assim:
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 - O PostgreSQL 9.0 é igualmente simples agora que string_agg(expressão, delimitador) está embutido. Aqui está com 'espaço de vírgula' entre os elementos:
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 antes de 9.0 permite que você defina suas próprias funções agregadas com CREATE AGGREGATE. Um pouco mais trabalhoso que o MySQL, mas muito mais flexível. Veja este outra postagem para mais detalhes. (É claro que o PostgreSQL 9.0 e versões posteriores também têm essa opção.)

  • Oráculo - mesma ideia usando LISTAGG .

  • MS SQL Server - mesma ideia usando STRING_AGG

  • Solução alternativa - em outras tecnologias de banco de dados ou em versões muito antigas das tecnologias listadas acima, você não tem essas funções de concatenação de grupo. Nesse caso, crie um procedimento armazenado que receba o org_id como entrada e gere os nomes de funcionários concatenados. Em seguida, use este procedimento armazenado em sua consulta. Algumas das outras respostas aqui incluem alguns detalhes sobre como escrever procedimentos armazenados como esses.
select 
  o.ID, o.Address, o.OtherDetails,
  MY_CUSTOM_GROUP_CONCAT_PROCEDURE( o.ID ) as Employees
from 
  organization o