“Ambigu nom de la colonne” erreur sur un serveur en particulier
Cette requête simple jette le Ambiguë "nom de la colonne id de la tâche" erreur sur un db-serveur uniquement. C'est ridicule. Nous avons testé cela avec la même structure de base de données sur des serveurs différents et de différentes versions de SQL Server (2005 /2008), et c'est uniquement CE client serveur qui génère l'erreur. En fait, je suis frustré.
SELECT Tasks.TaskID
FROM Tasks
INNER JOIN TaskHelpers ON TaskHelpers.TaskID = Tasks.TaskID
ORDER BY TaskID
Oui, je sais que je peux mettre Tasks.TaskID
dans le order by
clause, mais pour certaines raisons je ne peux pas.
Je n'ai JAMAIS compris pourquoi vous devez spécifier manuellement une à une colonne jointe vous faites référence. Sûrement, si ils sont rejoints ils vont être la même de toute façon!? (peut-être un peu bizarre de l'indice de choses que je ne reçois pas je suppose)
Semble intéressant (+1). Maintenant, quelle est la question??
si le problème ne persistent sur d'autres serveurs, vous devriez peut-être vérifier les mises à jour sql, ou de certains paramètres peut-être?
regardez le mode de compatibilité, vous sont en cours d'exécution sur chacun de ces DBs, il y a documenté des différences dans la lorsque le nom de la table/alias est nécessaire ou non dans la clause ORDER BY. Voir ma réponse ci-dessous pour les liens et plus d'info.
Bécasse des bois: ils pourraient ne pas être les mêmes, par exemple lorsque vous utilisez une JOINTURE GAUCHE. maintenant, pourquoi la base de données n'a pas de figure lorsque la clause on a exactement le même nom, je suppose que la base de données a généraliser analyseur pour tous les types de jointures, il JOINTURE GAUCHE, JOINTURE INTERNE, etc
Semble intéressant (+1). Maintenant, quelle est la question??
si le problème ne persistent sur d'autres serveurs, vous devriez peut-être vérifier les mises à jour sql, ou de certains paramètres peut-être?
regardez le mode de compatibilité, vous sont en cours d'exécution sur chacun de ces DBs, il y a documenté des différences dans la lorsque le nom de la table/alias est nécessaire ou non dans la clause ORDER BY. Voir ma réponse ci-dessous pour les liens et plus d'info.
Bécasse des bois: ils pourraient ne pas être les mêmes, par exemple lorsque vous utilisez une JOINTURE GAUCHE. maintenant, pourquoi la base de données n'a pas de figure lorsque la clause on a exactement le même nom, je suppose que la base de données a généraliser analyseur pour tous les types de jointures, il JOINTURE GAUCHE, JOINTURE INTERNE, etc
OriginalL'auteur Alex | 2010-05-07
Vous devez vous connecter pour publier un commentaire.
Vous obtiendrez l'ambiguïté de la colonne nom de l'erreur si vous exécutez votre requête dans sql server 2000, ou sous le niveau de compatibilité de 80 ou moins. Sur sql server 2005/2008 avec le niveau de compatibilité 90 ou plus, yur la requête s'exécute correctement.
De la clause order by docs:
"Dans SQL Server 2005, qualifié les noms de colonnes et alias sont résolus pour les colonnes figurant dans la clause from. Si order_by_expression n'est pas qualifié, la valeur doit être unique parmi toutes les colonnes figurant dans l'instruction SELECT."
les grands esprits... 🙂
OriginalL'auteur Ray
Disait ma Mère entrent toujours en ligne de CHAQUE colonne dans une requête avec un nom de table/alias comme "toujours inclure tous les noms de colonne dans les INSERTs" et justs comme "ne pas SÉLECTIONNER *", etc.
Autre que de le rendre plus facile, car il est auto-documentation du code source, vous éviter cette erreur si jamais vous ajouter/modifier des colonnes.
vérifier vos niveaux de compatibilité, il y a des différences entre eux et le comment de l'ORDRE PAR les travaux!
En général, au niveau de compatibilité 90 et plus, le niveau par défaut de SQL Server 2008, une ORDONNANCE sans un nom de table/alias instruction génère l'erreur.
MODIFIER la BASE de données de Niveau de Compatibilité (Transact-SQL) voir la section: les Différences Entre le Niveau de Compatibilité 80 et le Niveau 90
Paramètre de niveau de compatibilité de 80
Paramètre de niveau de compatibilité 90
OriginalL'auteur KM.
Vous pouvez spécifier l'index de la colonne pour trier la place:
Parce que la réponse est fausse. Il ne devrait pas être une erreur quand il y a une colonne avec le nom/alias dans le
SELECT
clause et que le nom est référencé dans laORDER BY
. Voir SQL-Violon L'erreur était due à un bug dans certaines vieilles versions de/niveaux de compatibilité SQL-Server, qui a été fixéIl semble que SQL Server ne fait que, au moins dans les versions plus récentes. Avez-vous une référence à pourquoi? Pourquoi sont les champs qui sont sélectionnés par défaut pour la commande par?
C'est ce que tous les SGBD faire (au moins ceux que je connais). Vous pouvez essayer le SQL-Violon. Oracle, MySQL et Postgres se comportent de la même manière.
La norme SQL a probablement une explication approfondie, mais je trouve ça assez dur à lire. Vous pouvez trouver un projet. Je pense que l'explication est dans la page 208 (dans les lignes: "a) si N=1 ..."), mais je ne parierais ma vie 🙂
OriginalL'auteur Guffa
Wow. Le problème était avec la base de données en mode de compatibilité. Il a été mis à "80" (sql 2000). Je l'ai fixé à 90 et que la requête fonctionne très bien maintenant.
Plus d'informations sur les niveaux de compatibilité peuvent être trouvés ici:
http://msdn.microsoft.com/en-US/library/ms178653(SQL.90).aspx
bienvenue dans le monde du conseil. Nous n'avons pas la changer, le client n' 🙁
OriginalL'auteur Alex
que si vous essayer avec les identifiants? En utilisant ces identifiants SQL server connaissez la colonne à l'ordre par. Je n'ai jamais fait de toute autre manière et jamais eu de problèmes. Je n'ai pas exactement pourquoi sql besoins de ces identifiants, il est évident qu'il ne sais pas où l'ordre quand il y a ambiguë columnnames. Essayez quelque chose comme;
EDIT:
Et ce qui est la raison pour laquelle vous ne pouvez pas? SQL de lancer une erreur?
OriginalL'auteur Rob
Que voulez-vous dire que vous ne pouvez pas? Il est clair que les deux Tâches et TaskHelpers a une colonne nommée TaskID. Vous devez indiquer quel tableau de la colonne dans l'Ordre Par les est associée.
OriginalL'auteur Randy Minder