Bonjour à tous,
voila quelques heures que je débugge une requête et je m'aperçois que le comportement est différent si je mets une sous-requête dans un FROM ou si je mets cette même sous-requête dans une table temporaire et que je l'utilise ensuite dans une requête.
concrètement, je ne comprend pas comment une sous-requête "stand alone" peut renvoyer des résultats différents selon son mode d'utilisation.
Si quelqu'un peut m'expliquer, je suis preneur.
Merci.
(A noter que la sous-requête contient une jointure externe. A noter également que c'est l'utilisation d'un critère sur la sous-requête qui semble changer le comportement)
Voici les 2 méthodes:
Méthode avec la sous-reuqête dans le FROM
Résultat:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 select tmp1.DateDebutAppartenance , tmp1.DateFinAppartenance , getdate()+45 PlageDebut , getdate()+90 PlageFin , utilisateurprosodie.* , utilisateur.login , utilisateur.DateDebutValide , utilisateur.DateFinValide , utilisateur.Nom , utilisateur.Prenom , utilisateur.TelephoneFixe , utilisateur.TelephoneMobile , Convert(varchar(8000), utilisateur.Commentaire) as Commentaire , utilisateur.Actif , utilisateur.Email from utilisateurprosodie , utilisateur , ( select h.idutilisateur , h.propriete , h.valeur , h.datemodification DateDebutAppartenance , isnull(h2.datemodification,getdate()+99999) DateFinAppartenance from historiquedonneesadministratives h , historiquedonneesadministratives h2 where h.propriete=2 and h.valeur=52 and h2.idhistoriqueadmin=* (select top 1 idhistoriqueadmin from historiquedonneesadministratives h3 where h3.propriete=2 and h3.idutilisateur=h.idutilisateur and h3.datemodification>h.datemodification order by h3.datemodification asc) ) tmp1 /*Date de début et de fin d'appartenance à une EO*/ where utilisateur.idutilisateur=utilisateurprosodie.idutilisateur and tmp1.idutilisateur=utilisateurprosodie.idutilisateur and (tmp1.DateDebutAppartenance between getdate()+45 and getdate()+90 or tmp1.DateFinAppartenance between getdate()+45 and getdate()+90 or getdate()+45 between tmp1.DateDebutAppartenance and tmp1.DateFinAppartenance or getdate()+90 between tmp1.DateDebutAppartenance and tmp1.DateFinAppartenance)
Méthode avec la sous-reuqête dans une table temporaire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 2008-09-23 10:44:58.430 2282-09-12 14:05:32.003 2009-01-12 14:05:32.003 2009-02-26 14:05:32.003 2261 0661213527 3013 NULL 1108 52 70300000 5 2 NULL NULL NULL 0 NULL NULL njamin 2007-07-02 00:00:00.000 NULL JAMIN NADINE 0146841131 0146841131 NULL 1 njamin@prosodie.com
Résultat:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 CREATE TABLE #tmp (idutilisateur int, propriete int, valeur tinyint, DateDebutAppartenance datetime, DateFinAppartenance datetime); INSERT INTO #tmp select h.idutilisateur, h.propriete, h.valeur, h.datemodification DateDebutAppartenance, isnull(h2.datemodification,getdate()+99999) DateFinAppartenance from historiquedonneesadministratives h, historiquedonneesadministratives h2 where h.propriete=2 and h.valeur=52 and h2.idhistoriqueadmin=* (select top 1 h3.idhistoriqueadmin from historiquedonneesadministratives h3 where h3.propriete=2 and h3.idutilisateur=h.idutilisateur and h3.datemodification>h.datemodification order by h3.datemodification asc); select tmp1.DateDebutAppartenance,tmp1.DateFinAppartenance,getdate()+45 PlageDebut,getdate()+90 PlageFin, utilisateurprosodie.*, utilisateur.login, utilisateur.DateDebutValide, utilisateur.DateFinValide, utilisateur.Nom, utilisateur.Prenom, utilisateur.TelephoneFixe, utilisateur.TelephoneMobile, Convert(varchar(8000), utilisateur.Commentaire) as Commentaire, utilisateur.Actif, utilisateur.Email from utilisateurprosodie, utilisateur, #tmp tmp1 /*Date de début et de fin d'appartenance à une EO*/ where utilisateur.idutilisateur=utilisateurprosodie.idutilisateur and tmp1.idutilisateur=utilisateurprosodie.idutilisateur and (tmp1.DateDebutAppartenance between getdate()-45 and getdate()+90 or tmp1.DateFinAppartenance between getdate()-45 and getdate()+90 or getdate()-45 between tmp1.DateDebutAppartenance and tmp1.DateFinAppartenance or getdate()+90 between tmp1.DateDebutAppartenance and tmp1.DateFinAppartenance)
Les résultats en gras changent... ce que je ne comprends pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 2008-09-23 10:44:58.430 2008-12-17 16:00:13.297 2009-01-12 14:03:53.953 2009-02-26 14:03:53.953 2261 0661213527 3013 NULL 1108 52 70300000 5 2 NULL NULL NULL 0 NULL NULL njamin 2007-07-02 00:00:00.000 NULL JAMIN NADINE 0146841131 0146841131 NULL 1 njamin@prosodie.com
[Ne pas essayer de comprendre le fonctionnement des requêtes, je pense que ça n'a pas d'interet pour l'explication à priori]
Merci pour votre aide.
Partager