- Este tópico contém 11 respostas, 5 vozes e foi atualizado pela última vez 12 anos, 11 meses atrás por rman.
-
AutorPosts
-
21 de dezembro de 2011 às 4:28 pm #102287italocloneParticipante
Colegas,
segue select:
SELECT CAB.CODEMP EMP,
CAB.NUMNOTA || CAB.SERIENOTA || CAB.VLRNOTA VALIDADOR,
EMP.CGC CNPJ_ORIGEM,
EMP.NOMEFANTASIA,
PAR.NOMEPARC DESTINO,
PAR.CGC_CPF CNPJ_DESTINO,
CAB.NUMNOTA NOTA,
CAB.NUNOTA nunota,
CAB.SERIENOTA SERIE,
CAB.DTNEG,
CAB.VLRNOTA VALOR,
CAB.CODTIPOPER TOP
FROM TGFCAB CAB,
TGFPAR PAR,
TSIEMP EMP
WHERE CAB.SERIENOTA <> 'D' AND
CAB.SERIENOTA <> 'CF' AND
CAB.DTNEG >= '01/11/2011' AND
CAB.DTNEG <= '30/11/2011' AND ( CAB.CODPARC = 43 OR CAB.CODPARC = 44 OR CAB.CODPARC = 45 OR CAB.CODPARC = 46 OR CAB.CODPARC = 47 OR CAB.CODPARC = 48 OR CAB.CODPARC = 49 OR CAB.CODPARC = 50 OR CAB.CODPARC = 51 OR CAB.CODPARC = 52 OR CAB.CODPARC = 53 OR CAB.CODPARC = 54 OR CAB.CODPARC = 55 OR CAB.CODPARC = 56 OR CAB.CODPARC = 57 OR CAB.CODPARC = 58 OR CAB.CODPARC = 60 OR CAB.CODPARC = 61 OR CAB.CODPARC = 62 OR CAB.CODPARC = 63 OR CAB.CODPARC = 64 OR CAB.CODPARC = 65 OR CAB.CODPARC = 66 OR CAB.CODPARC = 67 OR CAB.CODPARC = 68 OR CAB.CODPARC = 69 OR CAB.CODPARC = 70 OR CAB.CODPARC = 453 OR CAB.CODPARC = 215 ) AND CAB.CODPARC = PAR.CODPARC AND CAB.CODEMP = EMP.CODEMP ORDER BY VALIDADORA coluna VALIDADOR eu criei para diferenciar os resultados, eu não quero que apareça resultado VALIDADOR repetido,
Como não conheço tanto assim de sql tentei usar o Distinct e não conseguei21 de dezembro de 2011 às 5:22 pm #102289rmanParticipante@italoclone
Como está o relacionamento das tabelas TGFCAB com a TGFPAR e TSIEMP ? 1 para N ? Provavelmente seja, talvez com subselect.
Se for 1 pra 1, deve estar faltando ligação entre as tabelas.
21 de dezembro de 2011 às 5:41 pm #102290italocloneParticipante[quote=”rman”:jmj5fln9]@italoclone
Como está o relacionamento das tabelas TGFCAB com a TGFPAR e TSIEMP ? 1 para N ? Provavelmente seja, talvez com subselect.
Se for 1 pra 1, deve estar faltando ligação entre as tabelas.[/quote]
Quando uso o select abaixo consigo o resultado que quero porem preciso de mais informações.
SELECT DISTINCT CAB.NUMNOTA
FROM TGFCAB CAB,
TGFPAR PAR,
TSIEMP EMP
WHERE CAB.SERIENOTA 'D' AND
CAB.SERIENOTA 'CF' AND
CAB.DTNEG >= '01/11/2011' AND
CAB.DTNEG <= '30/11/2011' AND
(
CAB.CODPARC = 43 OR
CAB.CODPARC = 44 OR
CAB.CODPARC = 45 OR
CAB.CODPARC = 46 OR
CAB.CODPARC = 47 OR
CAB.CODPARC = 48 OR
CAB.CODPARC = 49 OR
CAB.CODPARC = 50 OR
CAB.CODPARC = 51 OR
CAB.CODPARC = 52 OR
CAB.CODPARC = 53 OR
CAB.CODPARC = 54 OR
CAB.CODPARC = 55 OR
CAB.CODPARC = 56 OR
CAB.CODPARC = 57 OR
CAB.CODPARC = 58 OR
CAB.CODPARC = 60 OR
CAB.CODPARC = 61 OR
CAB.CODPARC = 62 OR
CAB.CODPARC = 63 OR
CAB.CODPARC = 64 OR
CAB.CODPARC = 65 OR
CAB.CODPARC = 66 OR
CAB.CODPARC = 67 OR
CAB.CODPARC = 68 OR
CAB.CODPARC = 69 OR
CAB.CODPARC = 70 OR
CAB.CODPARC = 453 OR
CAB.CODPARC = 215
) AND
CAB.CODPARC = PAR.CODPARC AND
CAB.CODEMP = EMP.CODEMP21 de dezembro de 2011 às 8:30 pm #102292Regis AraujoParticipanteOpa.. boa tarde..!
Bom.. não entendi muito a sua solicitação..
Mas como q vc fez o distinct?
Faça um group by então..
É como o rman falou, se a relação das tabelas for 1->N realmente vc poderá ter alguns valores repitidos… Assim o group by vai ajuda-lo.
Abraços..!
21 de dezembro de 2011 às 10:31 pm #102293msantinoParticipante@italoclone,
Você não pode substituir essa série de “CAB.CODPARC = XX OR” pelo IN() ?
Ficaria assim:
SELECT DISTINCT CAB.NUMNOTA
FROM TGFCAB CAB,
TGFPAR PAR,
TSIEMP EMP
WHERE CAB.SERIENOTA 'D' AND
CAB.SERIENOTA 'CF' AND
CAB.DTNEG >= '01/11/2011' AND
CAB.DTNEG <= '30/11/2011' AND
CAB.CODPARC IN (43, 44, 45, 46, 47,48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 453, 215) AND
CAB.CODPARC = PAR.CODPARC AND
CAB.CODEMP = EMP.CODEMPmais fácil de ler e de manter, não?
21 de dezembro de 2011 às 10:58 pm #102294rmanParticipante@msantino
Pelo que eu percebi, essa sequencia de OR deve ser gerado dinamicamente na aplicação, por isso que ele não deve ter usado o IN.
Outro detalhe que muito não sabem, existe um limite de itens dentro do IN.
22 de dezembro de 2011 às 3:53 pm #102296msantinoParticipante@rman,
Sim, existe limite dentro do IN, mas se for uma parada controlada aonde sabe-se que não chegará perto desse limite, acho que vale a pena usar.
E mesmo dinamicamente, quando você recebe a lista de valores pode dar um split com “,” e tacar dentro dos parênteses. Lembro que na época que eu era programador e fazia esse tipo de filtros dinâmicos o IN era uma ferramenta ótima!
22 de dezembro de 2011 às 4:19 pm #102298Regis AraujoParticipanteOpa..!
O limite no IN é de 999 registros separados por , (virgula).
Abraços..!
23 de dezembro de 2011 às 9:28 pm #102316diegolenhardtParticipanteo IN destroi a performance,
uma solucao seria um temporary table,
onde voce preenche com os valores que tu quer, e relaciona ela na query..🙂
26 de dezembro de 2011 às 6:37 pm #102320rmanParticipante@diegolenhardt
Usar uma temporary table em vez do IN com 999 itens o ganho realmente é notório ?
26 de dezembro de 2011 às 6:40 pm #102321diegolenhardtParticipantenão depende da quantidade de argumentos do IN,
e sim do tamanho da sua tabela onde será pesquisada…
¬¬
o IN não vai usar indexes, e com o temporary vai…
ai a diferença..
26 de dezembro de 2011 às 6:50 pm #102322rmanParticipante@diegolenhardt
Fiz um teste simples utilizando IN sobre o índice de uma PK e usou índice. 😯
-
AutorPosts
- Você deve fazer login para responder a este tópico.