- Este tópico contém 4 respostas, 2 vozes e foi atualizado pela última vez 16 anos, 4 meses atrás por
Shiono.
-
AutorPosts
-
6 de novembro de 2009 às 10:01 pm #90759
Shiono
ParticipantePessoal estou fazendo uma query que le duas tabelas
A SB1010 – é a de produtos
A SYP010 – é a de descricao para importação
O problema esta no fato do YP_SEQ poder varia de 001 a NNNComo eu faço para pegar a informação da tabela SYP010, sem me importar com a quantidade de linhas que virao
select
b1.B1_COD AS Codigo_Produto
,b1.B1_DESC AS Descricao_Produto
,b1.B1_POSIPI AS NCM
,rtrim(y1.YP_TEXTO) || ‘, ‘ ||
rtrim(y2.YP_TEXTO) || ‘, ‘ ||
rtrim(y3.YP_TEXTO) || ‘, ‘ ||
rtrim(y4.YP_TEXTO) || ‘, ‘ ||
rtrim(y5.YP_TEXTO) AS Descricao_LI
from siga.sb1010 b1
left join
siga.syp010 y1
on B1_DESC_GI = y1.YP_CHAVE
and y1.YP_SEQ = ‘001’
left join
siga.syp010 y2
on y1.YP_CHAVE = y2.YP_CHAVE
and y2.YP_SEQ = ‘002’
left join
siga.syp010 y3
on y2.YP_CHAVE = y3.YP_CHAVE
and y3.YP_SEQ = ‘003’
left join
siga.syp010 y4
on B1_DESC_GI = y4.YP_CHAVE
and y4.YP_SEQ = ‘004’
left join
siga.syp010 y5
on B1_DESC_GI = y5.YP_CHAVE
and y5.YP_SEQ = ‘005’
where b1.D_E_L_E_T_ != ‘*’
and y1.D_E_L_E_T_ != ‘*’
and y2.D_E_L_E_T_ != ‘*’
and y3.D_E_L_E_T_ != ‘*’
and y4.D_E_L_E_T_ != ‘*’
and y5.D_E_L_E_T_ != ‘*’
and b1.b1_import = ‘S’
and b1.b1_fl != ‘S’
union
select
b1.B1_COD AS Codigo_Produto
,b1.B1_DESC AS Descricao_Produto
,b1.B1_POSIPI AS NCM
,’ ‘ AS Descricao_LI
from siga.sb1010 b1
where not exists (select YP_TEXTO from siga.syp010 where b1.B1_DESC_GI = YP_CHAVE)
and b1.D_E_L_E_T_ != ‘*’
and b1.b1_import = ‘S’
and b1.b1_fl != ‘S’
Order by Codigo_Produto;6 de novembro de 2009 às 11:24 pm #90764burga
ParticipanteOi Shiono,
Não sei se entendi direito, você quer uma consulta que retorne todas as descrições sem ter que ficar escrevendo vários joins?
Se for isso, já tentou fazer com SQL Dinâmico? Se você puder usar PL/SQL seria uma solução.
🙂
7 de novembro de 2009 às 12:20 am #90766Shiono
ParticipanteEu ainda estou me adaptando com isto pois, antigamente eu resolveria isto no codigo do programa, mas agora tenho que resolver no banco ainda tomo alguns bailes,
Se você puder me indicar como eu faço isto da query dinamica eu agradeço, eu posso usar pl/sql
7 de novembro de 2009 às 1:31 am #90767burga
ParticipanteOi Shiono,
No SQL dinâmico você executa qualquer comando SQL que pode ser montado em tempo de execução.
Assim você pode organizar a lógica do procedimento/função pra montar seu SQL em uma String, executar o comando SQL montado e retornar o valor buscado (no caso de ser um SELECT).
Segue um exemplo:
DECLARE
TYPE CUR_TYP IS REF CURSOR;
c_cursor CUR_TYP;
fila PAISES%ROWTYPE;
v_query VARCHAR2(255);
BEGIN
v_query := 'SELECT * FROM PAISES';OPEN c_cursor FOR v_query;
LOOP
FETCH c_cursor INTO fila;
EXIT WHEN c_cursor%NOTFOUND;
dbms_output.put_line(fila.DESCRIPCION);
END LOOP;
CLOSE c_cursor;
END;
Note que
v_query := 'SELECT * FROM PAISES';
é o SQL em forma de uma String, que pode ser montada dinamicamente.Aí vai o link de onde eu tirei o bloco de código do exemplo e mais outros links que explicam melhor o recurso:
http://www.devjoker.com/asp/ver_contenidos.aspx?co_contenido=66
http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96590/adg09dyn.htm
http://download-uk.oracle.com/docs/cd/B28359_01/appdev.111/b28370/dynamic.htm9 de novembro de 2009 às 2:00 pm #90771Shiono
ParticipanteMuito obrigado vou esudar os links, valeu pela ajuda.
-
AutorPosts
- Você deve fazer login para responder a este tópico.