NOT IN / NO EXIST très très lent BESOIN D'AIDE POUR REQUETE SQL

wico2002 Messages postés 71 Date d'inscription mardi 8 janvier 2002 Statut Membre Dernière intervention 19 octobre 2012 - 19 oct. 2012 à 01:45
pmcoste Messages postés 72 Date d'inscription mercredi 7 février 2007 Statut Membre Dernière intervention 25 juillet 2013 - 20 oct. 2012 à 00:03
Bonjour, j'ai une requête SQL (sous access) qui ne réponds plus a mes besoins car trop d'enregistrement donc prend 5 minutes à afficher les résultats. J'utilisais NOT IN car je voulais avoir ceux qui n'étaient pas dans un groupe en particulier mais trop long et maintenant je me cherche des solutions: J'explique

J'ai 2 tables: joueur et équipe_joueur (équipe_joueur est donc l'association entre un joueur x et une équipe y pour une saison z)

joueur > j_id, j_nom, j_prenom (+ autre champ pas important) > 2800 enregistrements
equipe_joueur > ej_id, ej_joueur, ej_saison, ej_equipe (+ autre champ pas important) > environ 550 enregistements par saison

Beaucoup d'enregistrement donc ça loop souvent.

Ma requête initiale est la suivante: (Je sélectionne les joueurs qui n'ont pas d'équipe pour la saison x)

SELECT j_id, j_nom, j_prenom, j_passeport
FROM joueur
WHERE j_id NOT IN
(SELECT ej_joueur
FROM equipe_joueur
WHERE ej_saison 11 AND ej_archiver 'n')
AND j_archiver = 'n'
ORDER BY j_nom,j_prenom,j_passeport


J'ai essayé ceci et ça ne donne aucun résultat.

SELECT j.j_id, j.j_nom, j.j_prenom, j.j_passeport
FROM j.joueur
WHERE NOT EXIST
(SELECT 'x'
FROM equipe_joueur
WHERE ej_joueur j.j_id AND ej_saison 11 AND ej_archiver = 'n')
AND j_archiver = 'n'
ORDER BY j_nom,j_prenom,j_passeport


Êtes vous capable de m'aider a trouver un code SQL qui me permetterait d'avoir les joueurs qui ne sont pas dans une équipes? et qui serait rapide et simple J'accepte aussi un code de jointure si vous êtes capable de me mettre [u]tousles joueurs et le id de l'équipe pour une saison x (J'afficherai seulement ceux qui n'auront pas de id d'équipe si il le faut)./u

MERCI si vous êtes capable de m'aider.




Merciwico2002

5 réponses

pmcoste Messages postés 72 Date d'inscription mercredi 7 février 2007 Statut Membre Dernière intervention 25 juillet 2013 1
19 oct. 2012 à 10:34
Bonjour,

Je pense qu'une jointure externe est plus rapide.
Essaie ca :
SELECT j.j_id, j.j_nom, j.j_prenom, j.j_passeport
FROM joueur j
    LEFT JOIN equipe_joueur e on e.ej_joueur=j.j_id AND e.ej_saison = 11 AND e.ej_archiver = 'n'
WHERE j.j_archiver = 'n'
AND e.ej_id is NULL
ORDER BY j.j_nom, j.j_prenom, j.j_passeport 



-------------------
Oderint dum metuant
wico2002 Messages postés 71 Date d'inscription mardi 8 janvier 2002 Statut Membre Dernière intervention 19 octobre 2012
19 oct. 2012 à 22:17
Merci,

oui une jointure externe est plus rapide mais j'ai encore un soucis.

SELECT joueur.j_id, joueur.j_nom, joueur.j_prenom, equipe_joueur.ej_saison
FROM joueur LEFT JOIN equipe_joueur ON joueur.j_id = equipe_joueur.ej_joueur
GROUP BY joueur.j_id, joueur.j_nom, joueur.j_prenom, equipe_joueur.ej_saison
ORDER BY joueur.j_id, joueur.j_nom, joueur.j_prenom;

ceci me donne tous les joueurs avec toutes les saison et aussi ceux qui n'ont jamais jouer. Par exemple:

M. Y, saison 9
M. Y, saison 10
M. Y, saison 11
...
M. Z, saison 8
M. Z, saison 10
M. Z, saison 11
...
M. W,
...

C'est pourquoi au début j'avais utiliser un NOT IN, mais maintenant c'est trop lent (5min)

J'ai essayer plusieurs SQL avec des group by/having/Distinct, mais toujours des problèmes. Des fois j'enlevais ceux qui était dans la saison 11 mais j'avais quand même toutes les autres saisons qu'il avait joué ? Car mon but est d'avoir une liste des joueurs libres

Si possible j'aimerais avoir ceux qui joue pour une saison x et sinon mettre 0 Par exemple:

M. A, saison 11
M. B, saison 0
M. C, saison 11

Est-ce possible avec un LEFT JOIN (pour avoir tous les joueurs) d'écrire une requete pour avoir les saisons x (on va dire 11) et si pas dans la saison x de mettre 0 ?

Sinon la dernière option qui me reste sera de faire un loop dans mon applicatoin pour vérifier si joue dans la saison x et si non je l'afficherai, mais je ne sais pas si sera trop long ou non
Merciwico2002
pmcoste Messages postés 72 Date d'inscription mercredi 7 février 2007 Statut Membre Dernière intervention 25 juillet 2013 1
19 oct. 2012 à 23:05
Un truc de ce style ?

SELECT joueur.j_id, joueur.j_nom, joueur.j_prenom, coalesce(max(equipe_joueur.ej_saison),0) as saison
FROM joueur LEFT JOIN equipe_joueur ON joueur.j_id = equipe_joueur.ej_joueur
GROUP BY joueur.j_id, joueur.j_nom, joueur.j_prenom
ORDER BY joueur.j_id, joueur.j_nom, joueur.j_prenom;


-------------------
Oderint dum metuant
wico2002 Messages postés 71 Date d'inscription mardi 8 janvier 2002 Statut Membre Dernière intervention 19 octobre 2012
19 oct. 2012 à 23:20
Merci mais malheureusement ceci ne fonctionne pas en Access. C'est du Transact-SQL(SQL Server)

Merci de ton aide, si tu a d'autre idée, n'hésite pas à m'en faire part, je vais continuer de chercher.

Merciwico2002

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pmcoste Messages postés 72 Date d'inscription mercredi 7 février 2007 Statut Membre Dernière intervention 25 juillet 2013 1
20 oct. 2012 à 00:03
Essaie de remplacer la fonction coalesce par isnull, ou recherche sur ton moteur de recherche favori l'équivalent sous access

-------------------
Oderint dum metuant
Rejoignez-nous