Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/06/2011, 10h58   #1
Expert Confirmé
 
Avatar de Lyche
 
Homme
Développeur SQL
Inscription : janvier 2007
Messages : 1 959
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur SQL

Informations forums :
Inscription : janvier 2007
Messages : 1 959
Points : 3 850
Points : 3 850
Envoyer un message via MSN à Lyche
Par défaut Indication sur une différence d'écriture

Bonjour,
je viens à vous parce que je me suis rendu compte d'un problème sur un processus et que j'aimerais comprendre pourquoi je suis tombé sur ce problème.

Lors d'un traitement, j'ai cette requête (celle d'origine)

Code sql :
1
2
3
4
5
6
7
8
9
10
11
 
SELECT
      DISTINCT
      t.id_T
   , 'monFiltre'
FROM
     dbo.maTable        t
     LEFT JOIN maTable2 u ON u.id_U = t.id_T    
                        AND u.champ_U = 'monFiltre'
WHERE
     u.id_U IS NULL;

J'ai toujours pensé que le where devait servir au filtre et les jointures et bah.. à joindre les tables.
Hors, si je fait cette modification :

Code sql :
1
2
3
4
5
6
7
8
9
10
11
 
SELECT
      DISTINCT
      t.id_T
   , 'monFiltre'
FROM
     dbo.maTable        t
     LEFT JOIN maTable2 u ON u.id_U = t.id_T
WHERE
     u.id_U    IS NULL
 AND u.champ_U = 'monFiltre'; -- Le filtre du ON est descendu dans le WHERE

Je me retrouve avec un résultat, non pas faux, mais complètement vide... Je ne comprends pas la différence entre les deux. Si quelqu'un pouvait me l'expliquer, je lui en serait reconnaissant.

Cordialement,
Lyche
__________________
Citation:
le programmeur est une machine bizarre qui transforme le café en code et le code en spaghetti
Joueurs de diablo 3 du forum, rejoignez nous Combattre le démon !
Lyche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h03   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
C'est normal. Les jointures s'exécutent AVANT les filtres.
En jointure externe gauche vous aurez des NULL dans la table de droite afin de reprendre toutes les données de la table de gauche.
En plaçant un filtre WHERE sur une colonne de la table u (table de droite) vous ré éliminez les NULL.

En faisant :
Code :
AND (u.champ_U = 'monFiltre' OR u.champ_U IS NULL)
Vous rétablissez les NULL.

Ceci dit les deux requêtes ne sont pas équivalente et pour comprendre pourquoi relisez ma seconde phrase !

Bref, apprenez SQL. Mon livre, comme mon site web peuvent vous y aider !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h15   #3
Expert Confirmé
 
Avatar de Lyche
 
Homme
Développeur SQL
Inscription : janvier 2007
Messages : 1 959
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur SQL

Informations forums :
Inscription : janvier 2007
Messages : 1 959
Points : 3 850
Points : 3 850
Envoyer un message via MSN à Lyche
Merci pour la réponse.
Cordialement
__________________
Citation:
le programmeur est une machine bizarre qui transforme le café en code et le code en spaghetti
Joueurs de diablo 3 du forum, rejoignez nous Combattre le démon !
Lyche est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h07.


 
 
 
 
Partenaires

Hébergement Web