GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Ajuda com vários inner joins

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:

image

Tabela Permissão:

image

tabela departamentos:

image

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