Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
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 14/02/2011, 17h49   #1
Invité de passage
 
Homme Yves Bélanger
Technicien en informatique
Inscription : février 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Yves Bélanger
Localisation : Canada

Informations professionnelles :
Activité : Technicien en informatique
Secteur : Service public

Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
Par défaut Erreur dans un SELECT imbriqué

Bonjour,

J'aurais un petit problème à vous soumettre

Dans un select imbriqué, il semble que la clause Where ne s'exécute pas
correctement.

Je m'explique:

Voici le code qui fonctionne:

Code :
1
2
3
4
5
6
7
8
9
SELECT noemploi, cast(nas AS char(9)) AS nasc
INTO #temp01
FROM emploi
WHERE idsynm_o = 11 AND noaccreditation = 1
 
SELECT * 
FROM statistiques..inform 
WHERE statistiques..inform.nasc IN (SELECT nasc FROM #temp01)
ORDER BY statistiques..inform.nasc, statistiques..inform.an
Le premier SELECT remplit une table temporaire selon certaines conditions.

Le second SELECT extrait les informations en fonction de la clause Where (qui recherche les informations contenues dans la table temporaire).

Ce script fonctionne correctement. Cependant il survient un problème dans le contexte suivant:

1. Le script est exécuté une fois correctement.

2. Pour faire des tests, le nom de la colonne "nasc" de la table temporaire a été modifiée en "nascar", sans toutefois modifier le nom de la colonne dans le SELECT imbriqué de la clause Where.

3. La table temporaire est supprimée et le script est exécuté de nouveau.

Code :
1
2
3
4
5
6
7
8
9
10
11
DROP TABLE #temp01
 
SELECT noemploi, cast(nas AS char(9)) AS nascar
INTO #temp01
FROM emploi
WHERE idsynm_o = 11 AND noaccreditation = 1
 
SELECT * 
FROM statistiques..inform 
WHERE statistiques..inform.nasc IN (SELECT nasc FROM #temp01)
ORDER BY statistiques..inform.nasc, statistiques..inform.an
Normalement, je pense que l'exécution de ce script modifié (et erroné) entraine un message d'erreur du type:
Citation:
"Invalid Column Name".
Pourtant, le script s'exécute. Si on ne rend pas compte de l'erreur dans le nom de la colonne, l'extraction qui en résulte est complètement erronée.

D'ou mon interrogation ???

En vous remerciant d'avance.

P.S. Je fonctionne sous SQL Server 2000.
belangy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 18h14   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
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 667
Points : 8 715
Points : 8 715
Bonjour,

Je comprend votre interrogation, et je trouve bizarre que cela fonctionne ...

Sinon j'aurai directement écrit :

Code :
1
2
3
4
5
6
7
SELECT		I.*
FROM		statistiques.dbo.inform AS I
INNER JOIN	statistiques.dbo.emploi AS E
			ON E.nas = I.nasc
WHERE		E.idsynm_o = 11
AND		E.noaccreditation = 1
ORDER BY	I.nasc, I.an
@++
__________________
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 10
Vieux 14/02/2011, 19h44   #3
Invité de passage
 
Homme Yves Bélanger
Technicien en informatique
Inscription : février 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Yves Bélanger
Localisation : Canada

Informations professionnelles :
Activité : Technicien en informatique
Secteur : Service public

Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
En fait, les SELECT font appel à des tables provenant de BD différentes. La table "emploi" provient de la BD Production, la table "inform" provient de la BD Statistiques et la table temporaire est stocké dans la BD "tempdb".

Peut-être le fait d'avoir des BD différentes explique-t-il cette "bizarrerie" ?

De plus, je dois absolument convertir la colonne NAS en CHAR car la table "inform" est une table basé sur une BD AS/400 ou le champs nasc est en CHAR.

Donc pour faire la jointure, les deux colonnes doivent être du même type.
belangy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 20h03   #4
Invité de passage
 
Homme Yves Bélanger
Technicien en informatique
Inscription : février 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Yves Bélanger
Localisation : Canada

Informations professionnelles :
Activité : Technicien en informatique
Secteur : Service public

Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
Bonjour,

Je viens de découvrir une autre erreur.

Dans le SELECT imbriqué, si on isole le SELECT entre paranthèse ( dans le cas présent: select nasc from #temp01), un message d'erreur apparaît:

"Invalid column name nasc".

Lorsque le SELECT est imbriqué, aucun message d'erreur.
belangy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2011, 11h27   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Lorsque vous faites ceci :
Code sql :
1
2
3
4
5
 
SELECT * 
FROM statistiques..inform 
WHERE statistiques..inform.nasc IN (SELECT nasc FROM #temp01)
ORDER BY statistiques..inform.nasc, statistiques..inform.an

Si #temp01 n'a pas de colonne nasc, c'est la colonne nasc de la table inform qui est prise en compte dans votre sous requête, (donc vous comparez avec une liste de N fois la même valeur, celle de la colonne nasc pour la ligne qui est évaluée, où N correspond au nombre de lignes de la table #temp01...)

Et dans ce cas, forcément, votre condition sera toujours vraie !

Si vous écrivez ceci :
Code sql :
1
2
3
4
5
 
SELECT * 
FROM statistiques..inform 
WHERE statistiques..inform.nasc IN (SELECT t.nasc FROM #temp01 t)
ORDER BY statistiques..inform.nasc, statistiques..inform.an
Là vous devriez avoir l'erreur que vous attendiez...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2011, 12h05   #6
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
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 667
Points : 8 715
Points : 8 715
Citation:
Envoyé par belangy
En fait, les SELECT font appel à des tables provenant de BD différentes. La table "emploi" provient de la BD Production, la table "inform" provient de la BD Statistiques et la table temporaire est stocké dans la BD "tempdb".
Pour la dernière, de toute façon vous n'avez pas le choix

Pour résoudre les bases de données, il suffit de qualifier les objets :

Code :
1
2
3
4
5
6
7
SELECT		I.*
FROM		Statistiques.statistiques.dbo.inform AS I
INNER JOIN	Production.statistiques.dbo.emploi AS E
			ON CAST(E.nas AS char(9)) = I.nasc
WHERE		E.idsynm_o = 11
AND		E.noaccreditation = 1
ORDER BY	I.nasc, I.an
Donc vous n'avez toujours pas besoin de table temporaire.

@++
__________________
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é
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h41.


 
 
 
 
Partenaires

Hébergement Web