J'ai vu des erreurs similaires sur SO, mais je ne trouve pas de solution à mon problème. J'ai une requête SQL comme:
SELECT DISTINCT
a.maxa ,
b.mahuyen ,
a.tenxa ,
b.tenhuyen ,
ISNULL(dkcd.tong, 0) AS tongdkcd
FROM phuongxa a ,
quanhuyen b
LEFT OUTER JOIN ( SELECT maxa ,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
AND
'Sep 5 2011'
GROUP BY maxa
) AS dkcd ON dkcd.maxa = a.maxa
WHERE a.maxa <> '99'
AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;
Lorsque j'exécute cette requête, le résultat de l'erreur est:
L'identifiant en plusieurs parties "a.maxa" n'a pas pu être lié. Pourquoi?
P / s: si je divise la requête en 2 requêtes individuelles, cela fonctionne bien.
SELECT DISTINCT
a.maxa ,
b.mahuyen ,
a.tenxa ,
b.tenhuyen
FROM phuongxa a ,
quanhuyen b
WHERE a.maxa <> '99'
AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;
et
SELECT maxa ,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
AND 'Sep 5 2011'
GROUP BY maxa;
sql
sql-server
sql-server-2005
PhamMinh
la source
la source
phuongxa
tableau comprend-il une colonnemaxa
?Réponses:
Vous mélangez des jointures implicites avec des jointures explicites. C'est autorisé, mais vous devez savoir comment le faire correctement.
Le fait est que les jointures explicites (celles qui sont implémentées à l'aide du
JOIN
mot - clé) ont priorité sur les jointures implicites (les jointures «virgule», où la condition de jointure est spécifiée dans laWHERE
clause).Voici un aperçu de votre requête:
Vous vous attendez probablement à ce qu'il se comporte comme ceci:
c'est-à-dire la combinaison de tables
a
etb
est jointe à la tabledkcd
. En fait, ce qui se passe estc'est-à-dire, comme vous l'avez peut-être déjà compris,
dkcd
est joint spécifiquement contreb
et uniquementb
, puis le résultat de la jointure est combinéa
et filtré davantage avec laWHERE
clause. Dans ce cas, toute référence àa
laON
clause n'est pas valide,a
est inconnue à ce stade. C'est pourquoi vous obtenez le message d'erreur.Si j'étais vous, j'essaierais probablement de réécrire cette requête, et une solution possible pourrait être:
Ici les tables
a
etb
sont jointes en premier, puis le résultat est joint àdkcd
. Fondamentalement, il s'agit de la même requête que la vôtre, en utilisant uniquement une syntaxe différente pour l'une des jointures, ce qui fait une grande différence: la référencea.maxa
dans ladkcd
condition de jointure de est désormais absolument valide.Comme @Aaron Bertrand l'a correctement noté, vous devriez probablement vous qualifier
maxa
avec un alias spécifique, probablementa
, dans laORDER BY
clause.la source
ORDER BY maxa
, merci. Quant aux dates, je crois que c'est ainsi que le PO a choisi de les préciser dans leur environnement.Parfois, cette erreur se produit lorsque vous utilisez votre schéma (dbo) dans votre requête de manière incorrecte.
par exemple si vous écrivez:
vous obtiendrez l'erreur.
Dans ces situations, changez-le en:
la source
si vous avez donné un nom à alies, changez-le en nom réel
par exemple
changer cela en
la source
Je rencontrais des difficultés avec le même message d'erreur dans SQL SERVER, car j'avais plusieurs jointures, ce qui changeait l' ordre des jointures pour moi.
la source
Dans mon cas, le problème s'est avéré être le nom d'alias que j'avais donné à la table. "oa" ne semble pas acceptable pour SQL Server.
la source
J'avais la même erreur de JDBC. J'ai tout vérifié et ma requête allait bien. Il s'est avéré, dans la clause où j'ai un argument:
Et la valeur de l'argument que je transmettais était nulle. Cela donne également la même erreur qui est trompeuse car lorsque vous effectuez une recherche sur Internet, vous vous rendez compte que quelque chose ne va pas avec la structure de la requête, mais ce n'est pas dans mon cas. Je pensais juste que quelqu'un pourrait être confronté au même problème
la source
Ce qui a fonctionné pour moi a été de changer ma clause WHERE en une sous-requête SELECT
DE:
À:
la source
Je suis nouveau dans SQL, mais je suis tombé sur ce problème dans un cours que je suivais et j'ai constaté que l'attribution de la requête au projet a spécifiquement aidé à éliminer l'erreur en plusieurs parties. Par exemple, le projet que j'ai créé était CTU SQL Project, donc je me suis assuré que j'ai commencé mon script avec USE [CTU SQL Project] comme première ligne comme ci-dessous.
la source
Si cette erreur se produit dans un
UPDATE
, revérifiez leJOIN
sur la table avec la colonne / le champ à l'origine de l'erreur.Dans mon cas, cela était dû à l'absence de
JOIN
lui - même, ce qui a généré la même erreur en raison d'un champ inconnu (comme l'a souligné Andriy ).la source
Au lieu de cela, vous pouvez essayer de joindre des tables comme,
Cela devrait fonctionner
la source
la source
Mon erreur a été d'utiliser un champ qui n'existait pas dans la table.
table1.field1 => n'existe pas
table2.field1 => est correct
Corrigez le nom de votre table.
mon erreur s'est produite en raison de l'utilisation de WITH
lorsqu'il est utilisé en association avec d'autres tables ...
la source
Avez-vous oublié de rejoindre certaines tables? Sinon, vous devrez probablement utiliser certains alias.
la source
Je luttais également avec cette erreur et je me suis retrouvé avec la même stratégie que la réponse. J'inclus ma réponse juste pour confirmer qu'il s'agit d'une stratégie qui devrait fonctionner.
Voici un exemple où je fais d'abord une jointure interne entre deux tables que je connais a obtenu des données, puis deux jointures externes gauche sur des tables qui pourraient avoir des lignes correspondantes qui peuvent être vides. Vous mélangez les jointures internes et les jointures externes pour obtenir des résultats avec les données sur les tables au lieu de faire la syntaxe par défaut séparée par des virgules entre les tables et de manquer des lignes dans la jointure souhaitée.
Premièrement: effectuez les jointures internes entre les tables auxquelles vous vous attendez à ce que les données correspondent. Deuxième partie: Continuez avec les jointures externes pour essayer de récupérer des données dans d'autres tables, mais cela ne filtrera pas votre jeu de résultats si la jointure externe de la table n'a pas de données correspondantes ou ne correspond pas à la condition que vous avez définie dans le prédicat / condition on.
la source
Cette erreur peut également être provoquée par le simple fait de manquer une virgule
,
entre les noms de colonne dans l'instruction SELECT.par exemple:
la source