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 25/08/2011, 15h28   #1
Invité de passage
 
Serge LEWDEN
Inscription : novembre 2009
Messages : 3
Détails du profil
Informations personnelles :
Nom : Serge LEWDEN

Informations forums :
Inscription : novembre 2009
Messages : 3
Points : 1
Points : 1
Par défaut Clause IN : Bug SQL Server ou Y a t il une explication ?

Bonjour,
Je suis tombé par hasard sur ce cas et je ne parviens pas à l'expliquer. Pouvez vous m'aider ??

J'exécute une requête du style suivant sur une base SQL Server 2008 R2 :

SELECT * FROM Table WHERE Cle_etrangère1 IN (SELECT col_inconnue FROM Table2 WHERE critère_sur_table2)

==> Je tiens à préciser que la sous requête exécutée seule : "SELECT col_inconnue FROM Table2 WHERE critère_sur table2" génère une erreur SQL Server de compilation car la colonne demandée "col_inconnue" n'appartient pas à la table "Table2"

MAIS la requête complète fonctionne !!! il semble que le filtre "WHERE cle_etrangère1 IN ..." ne s'applique pas !!!


Pouvez vous me dire pourquoi ??
SLEWDEN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 15h59   #2
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 724
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 724
Points : 6 848
Points : 6 848
Bonjour,

On peut avoir la requête réelle qui vous genère votre erreur ?
Merci d'avance

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 16h35   #3
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
parce que col_inconnue appartient a votre 1er table (Table) et non a la seconde (table2) ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 19h37   #4
Invité de passage
 
Serge LEWDEN
Inscription : novembre 2009
Messages : 3
Détails du profil
Informations personnelles :
Nom : Serge LEWDEN

Informations forums :
Inscription : novembre 2009
Messages : 3
Points : 1
Points : 1
Citation:
Envoyé par mikedavem Voir le message
Bonjour,

On peut avoir la requête réelle qui vous genère votre erreur ?
Merci d'avance

++
Bonjour ci dessous un exemple de requête tiré de la base ASPNETDB (je n'ai les bases d'exemples de SQL Server DSL)

SELECT *
FROM dbo.aspnet_Roles
WHERE ApplicationID in (SELECT RoleId FROM dbo.aspnet_Applications WHERE applicationName = 'rouge')

RoleId n'existe pas dans la table "dbo.aspnet_Applications", mais existe bien dans "dbo.aspnet_Roles".
Si l'on prend une colonne qui n'existe pas du tout ou une colonne d'une autre table de la base de données, SQL Server génère bien une erreur...
SLEWDEN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 20h07   #5
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 724
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 724
Points : 6 848
Points : 6 848
Il n'y a pas de bug la dedans. Cela revient à écrire cela (en mettant un alias) :

Code :
1
2
3
SELECT R.* 
FROM dbo.aspnet_Roles AS R
WHERE R.ApplicationID IN (SELECT R.RoleId FROM dbo.aspnet_Applications WHERE applicationName = 'rouge')
Dans ce cas l'exécution de la requête entière fonctionne mais pas la sous requête.

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 20h32   #6
Invité de passage
 
Serge LEWDEN
Inscription : novembre 2009
Messages : 3
Détails du profil
Informations personnelles :
Nom : Serge LEWDEN

Informations forums :
Inscription : novembre 2009
Messages : 3
Points : 1
Points : 1
Citation:
Envoyé par mikedavem Voir le message
Il n'y a pas de bug la dedans. Cela revient à écrire cela (en mettant un alias) :

Code :
1
2
3
SELECT R.* 
FROM dbo.aspnet_Roles AS R
WHERE R.ApplicationID IN (SELECT R.RoleId FROM dbo.aspnet_Applications WHERE applicationName = 'rouge')
Dans ce cas l'exécution de la requête entière fonctionne mais pas la sous requête.

++
OK effectivement, je comprends mieux avec l'alias pourquoi cela fonctionne au niveau de la syntaxe T-SQL.
Merci beaucoup de vos réponses.
SLEWDEN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 23h10   #7
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
D'où l'importance de toujours qualifier :

- les objets (tables, vues, fonctions, procédures stockées) par le nom du schéma auquel ils appartiennent
- le nom des colonnes par le nom de la table ou de la vue (ou par leur alias)

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket 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 02h53.


 
 
 
 
Partenaires

Hébergement Web