[firebase-br] Ajuda em SQL - Linhas em uma unica coluna
Sandro Souza
escovadordebits em gmail.com
Qui Jun 25 14:42:13 -03 2009
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