Jointure requete

Rayh -  
 noob -
Bonjour,
et merci de prendre de votre temps pour m'aider


Voila mon problème, je suis actuellement en stage et je dois géré le droit d'accès des utilisateurs qui sont "cachés" dans trois tables différentes enfin c'est un bon bordel.

requete (sans jointure)
SELECT Distinct(LGAC.T_AGENT.COAGEN), NOAGEN, Prenom FROM LGAC.T_AGENT WHERE LGAC.T_AGENT.COAGEN IN(SELECT COAGE2 FROM LGAC.T_ACAGEN WHERE COAGE1='A999') OR LGAC.T_AGENT.COAGEN IN(SELECT LGAC.T_APSERV.COAGEN FROM LGAC.T_SERVIC, LGAC.T_DIRECT, LGAC.T_ACDIRE, LGAC.T_APSERV WHERE LGAC.T_ACDIRE.CODIRE = LGAC.T_SERVIC.CODIRE AND LGAC.T_APSERV.COSERV=LGAC.T_SERVIC.COSERV AND LGAC.T_ACDIRE.COAGEN ='A999') OR LGAC.T_AGENT.COAGEN IN(SELECT LGAC.T_APSERV.COAGEN FROM LGAC.T_ACSERV, LGAC.T_APSERV WHERE LGAC.T_APSERV.COSERV=LGAC.T_ACSERV.COSERV AND LGAC.T_ACSERV.COAGEN='A999') or LGAC.T_AGENT.COAGEN='A999'

Donc ça c'est ma requête pour récupére les nom et les prénom des agents sur lesquels la personne à un droit de regard
mais c'est une fois que j'ai ça j'aimerais récupérer le numéro de service de l'agent qui se trouve dans une autre table en fesant une jolie jointure (normal)


Requete (avec jointure)
SELECT Distinct(LGAC.T_AGENT.COAGEN), NOAGEN, COSERV, Prenom FROM LGAC.T_AGENT, LGAC.T_APSERV WHERE LGAC.T_APSERV.COAGEN=LGAC.T_AGENT.COAGEN AND LGAC.T_AGENT.COAGEN IN(SELECT COAGE2 FROM LGAC.T_ACAGEN WHERE COAGE1='A999') OR LGAC.T_AGENT.COAGEN IN(SELECT LGAC.T_APSERV.COAGEN FROM LGAC.T_SERVIC, LGAC.T_DIRECT, LGAC.T_ACDIRE, LGAC.T_APSERV WHERE LGAC.T_ACDIRE.CODIRE = LGAC.T_SERVIC.CODIRE AND LGAC.T_APSERV.COSERV=LGAC.T_SERVIC.COSERV AND LGAC.T_ACDIRE.COAGEN ='A999') OR LGAC.T_AGENT.COAGEN IN(SELECT LGAC.T_APSERV.COAGEN FROM LGAC.T_ACSERV, LGAC.T_APSERV WHERE LGAC.T_APSERV.COSERV=LGAC.T_ACSERV.COSERV AND LGAC.T_ACSERV.COAGEN='A999') or LGAC.T_AGENT.COAGEN='A999'


et la je ne comprends pas il répete autant de fois le nom et prénom de l'agent qu'il y a de service


Exemple (requete sans la jointure):

Dupond Jean
Dupont Toto
George Sand


Exemple (requete avec la jointure admettons qu'il y ait 4 service):

Dupond Jean
Dupond Jean
Dupond Jean
Dupond Jean
Dupont Toto
Dupont Toto
Dupont Toto
Dupont Toto
....

Enfin voila je pense que vous avez compris
D'avance merci bcp

1 réponse

noob
 
Plutôt illisible tout ça, tu pourrais faire un effort et lire les règles du forum
SELECT Distinct(LGAC.T_AGENT.COAGEN), NOAGEN, COSERV, Prenom
FROM LGAC.T_AGENT, LGAC.T_APSERV
WHERE LGAC.T_APSERV.COAGEN=LGAC.T_AGENT.COAGEN
AND
(
LGAC.T_AGENT.COAGEN IN 
(
SELECT COAGE2
FROM LGAC.T_ACAGEN
WHERE COAGE1='A999'
)
OR LGAC.T_AGENT.COAGEN IN
(
SELECT LGAC.T_APSERV.COAGEN
FROM LGAC.T_SERVIC, LGAC.T_DIRECT, LGAC.T_ACDIRE, LGAC.T_APSERV
WHERE LGAC.T_ACDIRE.CODIRE = LGAC.T_SERVIC.CODIRE
AND LGAC.T_APSERV.COSERV=LGAC.T_SERVIC.COSERV
AND LGAC.T_ACDIRE.COAGEN ='A999'
)
OR LGAC.T_AGENT.COAGEN IN
(
SELECT LGAC.T_APSERV.COAGEN
FROM LGAC.T_ACSERV, LGAC.T_APSERV
WHERE LGAC.T_APSERV.COSERV=LGAC.T_ACSERV.COSERV
AND LGAC.T_ACSERV.COAGEN='A999'
)
or LGAC.T_AGENT.COAGEN='A999'
)

As-tu essayé de rajouter des parenthèses comme ci dessus ?
Pourquoi ne pas mettre la condition directement dans la jointure ?
Par exemple pour mysql :
SELECT ... FROM LGAC.T_AGENT
INNER JOIN LGAC.T_APSERV ON LGAC.T_APSERV.COAGEN=LGAC.T_AGENT.COAGEN
WHERE...
0