SQL - socorro!

7 respostas
Nelson_Rodrigo_Furla

boa tarde pessoal,

sql não é o foco mas se puderem me ajudar…
estou utilizando o iReport e escrevi a seguinte SQL:

SELECT  f.num_os , f.cod_cliente, f.cod_trator
            , a.cont , a.nome_cliente
            , b.cont , b.modelo, b.marca
            , c.num_os , c.veiculo
            , d.num_os , d.mecanico
            , e.num_os , e.descricao , e.v_bruto , e.desconto , e.total 

FROM    cliente a , trator b , os_veiculo c , os_mecanico d , os_servico e , os f

WHERE  d.num_os      = c.num_os
   AND e.num_os      = d.num_os
   AND f.num_os      = c.num_os
   AND f.num_os      = d.num_os 
   AND f.num_os      = e.num_os
   AND f.cod_cliente = a.cont
   AND f.cod_trator  = b.cont 
   AND f.num_os = 2593

só que ela carrega valores repetidos, por exemplo, se tem 2 serviços cadastrados, retorna 2 vezes cada um e imprimi isso no iReport.

o que estou fazendo de errado ???

se alguem puder me ajudar eu agradeço !

7 Respostas

mauro80

Estou um pouco enferrujado em sql mas tenta assim pra ver:

SELECT  f.num_os , f.cod_cliente, f.cod_trator  
             , a.cont , a.nome_cliente  
             , b.cont , b.modelo, b.marca  
             , c.num_os , c.veiculo  
             , d.num_os , d.mecanico  
             , e.num_os , e.descricao , e.v_bruto , e.desconto , e.total   
   
 FROM    cliente a , trator b , os_veiculo c , os_mecanico d , os_servico e , os f  
   
 WHERE  d.num_os      = c.num_os  
    AND e.num_os      = d.num_os  
    AND f.num_os      = c.num_os  
    AND f.cod_cliente = a.cont  
    AND f.cod_trator  = b.cont   
    AND f.num_os = 2593
K

talvez isso possa ajudar: http://www.w3schools.com/sql/sql_distinct.asp

Abraço!

Nelson_Rodrigo_Furla

então mauro… não sei se a sql está errada, ou estou tratando erradamente no iReport, mas pelo fato de 1 OS, poder ter 3 mecanicos, 2 veiculos, uns 8 tipo de serviços diferentes, a resposta sempre vem com o numero de linhas dos serviços que são os que tem mais registros, e o restante das colunas se repetem com suas proprias informções para que se preencha todas as colunas… então se tem 2 mecanicos as colunas saem “fulano” “beltrano” “fulano” “beltrano”…

parece que no proprio select tem como fazer outros selects, não se seria esse o caso

w1l14n

Procure usar a cláusula group by ou distinct.

L.Bach

Nelson,

provavelmente tu esteja esquecendo de colocar um dos campos da chave-primária no Where.

A pergunta que não quer calar: se uma dessas comparações do where não fechar, tu quer que o registro não venha, ou basta o campo ser null?
Eu modificaria esse SQL para:

SELECT  f.num_os , f.cod_cliente, f.cod_trator  
                , a.cont , a.nome_cliente  
                , b.cont , b.modelo, b.marca  
                , c.num_os , c.veiculo  
                , d.num_os , d.mecanico  
                , e.num_os , e.descricao , e.v_bruto , e.desconto , e.total   
      
    FROM    os f

    LEFT OUTER JOIN cliente a ON
	f.num_os = a.cont
    LEFT OUTER JOIN trator b ON
    	f.cod_trator = b.cont
    LEFT OUTER JOIN os_veiculo c ON
        f.num_os = c.num_os
    LEFT OUTER JOIN os_mecanico d ON
        d.num_os = c.num_os AND
        d.num_os = f.num_os 
    LEFT OUTER JOIN os_servico e ON
	e.num_os = d.num_os AND
	e.num_os = f.num_os	
     
   WHERE  f.num_os = 2593

Com o LEFT OUTER JOIN, caso o trator, por exemplo, dessa OS tenha sido excluído, o campo trator vai retornar null. Se tu colocar tudo como INNER JOIN (Where), o registro não retornaria na consulta. Mas verifica também se não esqueceu de algum campo da chave-primária.

Abraço

johannsen

tenta usar select distinct …resto da Query

distinct remove as duplicatas

abelgomes

talvez oque vc queira seja um select para cada coluna…é isso?

Criado 16 de janeiro de 2009
Ultima resposta 19 de jan. de 2009
Respostas 7
Participantes 7