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
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:
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.