[firebase-br] Ajuda em SQL - Linhas em uma unica coluna
Flávio Henrique Zangerolamo
flaviozan em ig.com.br
Qui Jun 25 17:03:27 -03 2009
Sandro muito obrigado cara, funcionou certinho...
2009/6/25 Sandro Souza <escovadordebits em gmail.com>
> Bom dia/tarde Flávio.
>
> Grande Flávio, dependendo da versão do Firebird, você poderia utilizar o
> operador LIST, como no exemplo abaixo:
>
> SELECT
> P.CODIGO,
> P.DESCRICAO,
> (SELECT
> LIST(C.DESCRICAO_COR, ' - ')
> FROM
> CORES C
> WHERE
> C.COD_PRODUTO = P.CODIGO) CORES,
> (SELECT
> LIST(T.DESCRICAO_TAM, ' - ')
> FROM
> TAMANHOS T
> WHERE
> T.COD_PRODUTO = P.CODIGO) TAMANHOS
> FROM
> PRODUTOS P;
>
> Caso a sua versão de Firebird ainda não tenha o operador LIST, então
> utilize uma stored procedure como a seguinte:
>
> SET TERM ^ ;
>
> -- Concatena todos os registros e retorna o resultado.
> CREATE OR ALTER PROCEDURE FBLIST (
> -- Código SQL que gerará os registros a serem concatenados.
> CODIGO_SQL VARCHAR(2048),
> -- String de separação dos possíveis valores.
> SEPARADOR VARCHAR(30)
> ) RETURNS (
> -- Resultado da concatenação.
> RESULTADO VARCHAR(32000)
> ) AS
> DECLARE VARIABLE NOVO_VALOR VARCHAR(200);
> BEGIN
> -- Não informou qualquer código SQL?
> IF ((CODIGO_SQL IS NULL)OR(CODIGO_SQL = '')) THEN
> -- Returna NULL.
> RESULTADO = NULL;
> ELSE
> BEGIN
> -- Não informou o separador de valores?
> IF ((SEPARADOR IS NULL)OR(SEPARADOR = '')) THEN
> -- Assume um separador padrão de valores.
> SEPARADOR = ',';
> -- Inicializa o resultado.
> RESULTADO = '';
> -- Laço de leitura e concatenação dos registros.
> FOR EXECUTE STATEMENT CODIGO_SQL INTO :NOVO_VALOR DO
> BEGIN
> -- Não é o primeiro valor?
> IF (RESULTADO <> '') THEN
> -- Concatena o separador de valores.
> RESULTADO = RESULTADO || SEPARADOR;
> -- Concatena o novo valor retornado.
> RESULTADO = RESULTADO || NOVO_VALOR;
> END -- FOR
> END -- ELSE
> -- Retorna a lista lida.
> SUSPEND;
> END^
>
> SET TERM ; ^
>
> Agora é só testar da seguinte forma:
>
> SELECT
> P.CODIGO,
> P.DESCRICAO,
> (SELECT
> RESULTADO
> FROM
> FBLIST('SELECT DESCRICAO_COR FROM CORES WHERE COD_PRODUTO = ' ||
> P.CODIGO, ' - ')) CORES,
> (SELECT
> RESULTADO
> FROM
> FBLIST('SELECT DESCRICAO_TAM FROM TAMANHOS WHERE COD_PRODUTO = ' ||
> P.CODIGO, ' - ')) TAMANHOS
> FROM
> PRODUTOS P;
>
> Espero ter ajudado mais que atrapalhado. :D
>
> 2009/6/25 Flávio Henrique Zangerolamo <flaviozan em ig.com.br>
>
>> Boa Dia a todos
>>
>>
>> Estou com o seguinte problema:
>> Tenho uma tabela de produtos com vários campos. (Codigo, Descricao,
>> etc...)
>> Tenho uma tabela de cores que se relaciona com a de produtos(Cod_Produto,
>> Cod_Cor, Descricao_Cor)
>> Tenho uma tabela de Tamanhos que se relaciona a de Produto(Cod_Produto,
>> Cod_Tamanho, Descricao_Tamanho)
>>
>> Preciso montar um select que retorne da seguinte forma:
>> Codigo_Produto, Descricao_Produto, Cores(exemplo: AZUL - VERMELHO - etc),
>> Tamanhos (P - M - G - GG - etc)
>>
>> ou seja, preciso que o resultado da tabela de Cores e de Tamanhos seja
>> retornado em apenas uma linha
>>
>> Desde já Agradeço..
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>> http://www.firebase.com.br/fb/artigo.php?id=1107
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>
>
Mais detalhes sobre a lista de discussão lista