Como Juntar
Eficientemente Múltiplas Linhas no SQL Server em um Único Campo Delimitado
Na gestão de banco de dados, especialmente ao lidar com bancos de dados relacionais como o SQL Server, você frequentemente encontra cenários onde precisa combinar múltiplas linhas em um único campo para melhor legibilidade e um processamento mais simples. Este post abordará como resolver esse problema usando funções do SQL Server, ilustrando o resultado desejado e soluções eficazes para diferentes versões do SQL Server.
A Declaração do Problema
Imagine que você tem duas tabelas: Veículos
e Locais
. Aqui está um exemplo rápido de como essas tabelas se parecem:
Tabela de Veículos
VehicleID | Nome |
---|---|
1 | Chuck |
2 | Larry |
Tabela de Locais
LocationID | VehicleID | Cidade |
---|---|---|
1 | 1 | Nova Iorque |
2 | 1 | Seattle |
3 | 1 | Vancouver |
4 | 2 | Los Angeles |
5 | 2 | Houston |
O objetivo é extrair dados de forma que mostre o nome de cada veículo juntamente com uma lista de seus locais associados. O resultado desejado deve parecer com isto:
VehicleID | Nome | Locais |
---|---|---|
1 | Chuck | Nova Iorque, Seattle, Vancouver |
2 | Larry | Los Angeles, Houston |
Embora você possa alcançar isso através de consultas complexas e codificação, precisamos de uma solução que simplifique o processo.
Solução: Usando Funções do SQL Server
Método 1: Usando FOR XML PATH
Se você está usando SQL Server 2005 ou posterior, um dos métodos mais eficazes para alcançar essa concatenação é o comando FOR XML PATH
. Aqui está como implementá-lo:
SELECT [VehicleID],
[Nome],
(STUFF((SELECT ', ' + [Cidade] AS [text()]
FROM [Locais]
WHERE (VehicleID = Veículo.VehicleID)
FOR XML PATH('')), 1, 2, '')) AS Locais
FROM [Veículo]
Explicação:
- A instrução
SELECT
interna recupera os locais para cadaVehicleID
e os concatena em uma única string. FOR XML PATH('')
nos permite gerar uma única string XML a partir das múltiplas linhas retornadas pela subconsulta.STUFF
é usado para remover a vírgula e o espaço iniciais da string concatenada.
Método 2: Usando STRING_AGG (SQL Server 2017 e Posterior)
Para aqueles que estão usando SQL Server 2017 ou mais recente, existe uma maneira ainda mais simples de alcançar isso usando a função STRING_AGG
. Aqui está como fica:
SELECT [VehicleID],
[Nome],
(SELECT STRING_AGG([Cidade], ', ')
FROM [Locais]
WHERE VehicleID = V.VehicleID) AS Locais
FROM [Veículo] V
Explicação:
STRING_AGG
aceita dois argumentos: a coluna que você deseja agregar e o delimitador com o qual deseja separar as entradas. É muito mais claro e eficiente do que o método anterior.
Conclusão
Combinar múltiplas linhas em um único campo delimitado no SQL Server pode aumentar significativamente a legibilidade e acessibilidade dos seus dados. Seja você uma versão mais antiga utilizando FOR XML PATH ou consiga usar STRING_AGG em versões mais novas, o SQL Server fornece as ferramentas necessárias para gerenciar seus dados de forma eficiente.
Ao entender essas técnicas, você pode simplificar suas consultas SQL, tornando-as mais fáceis de ler, manter e modificar no futuro. Sempre escolha o método que melhor se adapta à sua versão do SQL Server e às suas necessidades específicas.
Se você tiver alguma dúvida ou precisar de mais esclarecimentos sobre esses métodos, sinta-se à vontade para perguntar nos comentários abaixo!