bom tenho um select com vários innerjoins e estou com alguns problemas
meu select:
String sql = "SELECT * FROM equipamento_requisicao equipreq INNER JOIN equipamento_user equipuser ON (equipreq.idequipamento_user = equipuser.id_equipamento_do_usuario)INNER JOIN usuario user ON (user.id_usuario=equipuser.idusuario) INNER JOIN equipamentos equip ON (equip.id_equipamentos = equipuser.idequipamentos) INNER JOIN detalhe_status dStatus ON (dStatus.idequipamento_requisicao= equipreq.id_equipamento_requisicao) INNER JOIN status_requisicao statusreq on (statusreq.id_status= dStatus.idstatus) INNER JOIN permissao p ON(user.idpermissao= p.id_permissao) INNER JOIN departamentos dp ON(user.iddepartamento = dp.id_departamentos) INNER JOIN chefe_departamento cp ON(user.id_usuario = cp.idusuario) where statusreq.categoria='Ativa' ";
ele retorna isso no meu bd:
mesmo tendo apenas uma requisição e um equipamento de cada tipo:
era pra retornar apenas 2 registros e está retornando 4 ( 1 de cada tipo a mais.)
Qua tal postar as outras tabelas envolvidas?
Tabela equipamento user:
Tabela Usuario:
Tabela Detalhe Status:
Tabela Status Requisição:
Tabela Permissão:
tabela departamentos:
As linhas são realmente duplicadas ou elas contem algo diferente? Nem que seja um único campo?
Acontece que quando fazemos joins o resultado pode ser bem maior do que o esperado. Por exemplo:
Se você tiver 2 tabelas, cada uma com 2 registros, e fizer um JOIN
entre elas, você vai associar o primeiro registro da primeira tabela com os dois registros da segunda tabela, e depois vai associar o segundo registro da primeira tabela com os dois registros da segunda tabela novamente. Tendo 4 linhas no resultado que tem muitos campos em comum.
Se fizer com 3 tabelas, aí vai ter 8 linhas de resultado, e por aí vai.
Geralmente um SELECT DISTINCT
te ajuda a reduzir esse número
são repetidos mesmo
você poderia me dar um exemplo com esse distinct? Nunca vi ele.
Veja exatamente quais campos você quer retornar, raramente você vai querer retornar *
em uma query com tantos joins, e então faça assim:
SELECT DISTINCT
t1.id,
t1.nome,
t1.email,
t2.status,
t2.detalhes,
t2.observacao
FROM Tabela1 t1
INNER JOIN Tabela2 t2
ON t1.id = t2.id_usuario;
Perceba o DISTINCT
logo após o SELECT
2 curtidas