Ele rega os montes desde as suas câmaras; a terra farta-se do fruto das suas obras.
(Salmos 104:13)
Imaginemos que, queremos retornar uma lista de produtos de uma loja numa consulta só. Será que é possível? Por exemplo: Que
retorne no atributo 'produtos' o seguinte: videogame,cd,dvd,cadeira.
No MYSQL, é mais simples, basta apenas chamar a função GROUP_CONCAT.
Mas, no SQL SERVER, é um pouco mais complicado. Para se realizar isto deve-se fazer o seguinte;
Considere a seguinte estrutura de tabelas:
CREATE TABLE loja(
id INTEGER,
nome varchar(50)
)
CREATE TABLE produto(
id INTEGER,
id_loja INTEGER
nome VARCHAR(10),
preco FLOAT
)
Agora, vamos realizar algumas inserções:
INSERT INTO loja VALUES(1,'CARREFULL'); INSERT INTO produto VALUES (1,1,'videogame',2.00); INSERT INTO produto VALUES (2,1,'cd',3.00); INSERT INTO produto VALUES (3,1,'dvd',4.00); INSERT INTO produto VALUES (4,1,'cadeira',5.00);
Criação de uma tabela temporária (Isto pode variar dependendo do SGBD usado) com os dados dos produtos
SELECT produto.nome, Values1 = CAST(NULL AS VARCHAR(8000)) INTO #teste FROM produto WHERE produto.id_loja = '1'
Atualização para percorrer todos os registros da tabela temporária
/* Criação de variáveis */ DECLARE @retorno VARCHAR(8000), @Values1 varchar(8000) /* Setando valor padrão para a variável @Values1 */ SET @Values1 = '' /* Realizando uma atualização na tabela temporária #teste para percorrer todos os registros, e assim, poder adicionar o nome de cada produto á variável @Values1 */ UPDATE #teste SET Values1 = nome, @Values1 = @Values1 + nome + ',' /* Setando condicionalmente o valor da varíavel @retorno como equivalente ao valor da variável @Values1 */ if @Values1 = '' SET @retorno = '-' else SET @retorno = @Values1
Na consulta de loja, definimos que a lista de nomes de produtos separados por vírgula, ficarão na coluna 'produtos'
select loja.*,produtos=@retorno from loja WHERE id = 1;