Я видел похожие ошибки на SO, но я не нашел решения для моей проблемы. У меня есть запрос SQL, как:
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;
Когда я выполняю этот запрос, результат ошибки
таков: не может быть связан многокомпонентный идентификатор «a.maxa». Зачем?
P / s: если я разделю запрос на 2 отдельных запроса, он будет работать нормально.
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;
и
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
источник
источник
phuongxa
включать в таблицу столбецmaxa
?Ответы:
Вы смешиваете неявные объединения с явными объединениями. Это разрешено, но вы должны знать, как это сделать правильно.
Дело в том, что явные объединения (те, которые реализованы с использованием
JOIN
ключевого слова) имеют приоритет над неявными (соединения «запятые», где условие соединения указано вWHERE
предложении).Вот схема вашего запроса:
Вы, вероятно, ожидаете, что он будет вести себя так:
то есть сочетание таблиц
a
иb
объединяется с таблицейdkcd
. На самом деле, то, что происходитто есть, как вы, возможно, уже поняли, объединяется
dkcd
специально противb
и толькоb
тогда, результат объединения объединяетсяa
и фильтруется далее с помощьюWHERE
предложения. В этом случае любая ссылкаa
вON
предложении является недействительной,a
неизвестна на этом этапе. Вот почему вы получаете сообщение об ошибке.На вашем месте я бы, вероятно, попытался бы переписать этот запрос, и одним из возможных решений может быть:
Здесь таблицы
a
иb
соединяются в первую очередь, затем результат присоединяется кdkcd
. По сути, это тот же запрос, что и у вас, только с использованием другого синтаксиса для одного из объединений, что имеет большое значение: ссылкаa.maxa
вdkcd
условии соединения теперь абсолютно действительна.Как правильно заметил @Аарон Бертран, вам, вероятно, следует указать
maxa
конкретный псевдоним, возможноa
, вORDER BY
предложении.источник
ORDER BY maxa
, спасибо. Что касается дат, я полагаю, что именно так ФП решила указать их в своей среде.Иногда эта ошибка возникает при неправильном использовании схемы (dbo) в запросе.
например, если вы напишите:
вы получите ошибку.
В этих ситуациях измените его на:
источник
если вы дали псевдоним, измените его на фактическое
например
изменить это на
источник
Я боролся с тем же сообщением об ошибке в SQL SERVER, так как у меня было несколько объединений, изменение порядка объединений решило это для меня.
источник
В моем случае проблема оказалась в псевдониме, который я дал таблице. «oa» кажется неприемлемым для SQL Server.
источник
У меня была такая же ошибка от JDBC. Все проверил, и мой запрос был в порядке. Оказалось, в предложении где у меня есть аргумент:
И значение аргумента, который я передавал, был нулевым. Это также дает ту же ошибку, которая вводит в заблуждение, потому что при поиске в Интернете вы обнаружите, что что-то не так со структурой запроса, но это не в моем случае. Просто думал, что кто-то может столкнуться с той же проблемой
источник
Для меня сработало изменение предложения WHERE в подзапрос SELECT.
ИЗ:
TO:
источник
Я новичок в SQL, но столкнулся с этой проблемой в ходе обучения и обнаружил, что назначение запроса проекту помогло устранить ошибку, состоящую из нескольких частей. Например, проект, который я создал, был CTU SQL Project, поэтому я убедился, что начал свой сценарий с USE [CTU SQL Project] в качестве моей первой строки, как показано ниже.
источник
Если эта ошибка возникает в
UPDATE
, дважды проверьтеJOIN
таблицу со столбцом / полем, которое вызывает ошибку.В моем случае это было связано с отсутствием
JOIN
самого, который генерировал ту же ошибку из-за неизвестного поля (как указал Андрей ).источник
Вместо этого вы можете попробовать объединить таблицы, как,
Это должно работать
источник
источник
Моя ошибка заключалась в использовании поля, которого не было в таблице.
table1.field1 => не существует
table2.field1 => правильно
Исправьте свое имя таблицы.
моя ошибка произошла из-за использования WITH
при использовании в соединении с другими таблицами ...
источник
Вы забыли присоединиться к некоторым столам? Если нет, то вам, вероятно, нужно использовать псевдонимы.
источник
Я также боролся с этой ошибкой и в итоге использовал ту же стратегию, что и ответ. Я включил свой ответ, чтобы подтвердить, что это стратегия, которая должна работать.
Вот пример, где я делаю сначала одно внутреннее соединение двух таблиц, которые, как я знаю, получили данные, а затем два левых внешних объединения таблиц, которые могут иметь соответствующие строки, которые могут быть пустыми. Вы смешиваете внутренние и внешние объединения, чтобы получить результаты с данными по таблицам, вместо того, чтобы использовать синтаксис по умолчанию, разделенный запятыми, между таблицами и пропустить строки в желаемом соединении.
Во-первых: выполните внутренние объединения между таблицами, которые, как вы ожидаете, будут соответствовать данным. Вторая часть: Продолжите с внешними объединениями, чтобы попытаться получить данные в других таблицах, но это не отфильтрует ваш результирующий набор, если внешнее объединение таблицы не получило соответствующих данных или не соответствует условию, которое вы установили в предикате / условии on.
источник
Эта ошибка также может быть вызвана отсутствием запятой
,
между именами столбцов в операторе SELECT.например:
источник