SQL - socorro!

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 !

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 

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

Abraço!

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

Procure usar a cláusula group by ou distinct.

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:

[code] 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[/code]

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

tenta usar select distinct …resto da Query

distinct remove as duplicatas

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