More than likely your issue is that you are logged in using a database user whose default schema is different than the schema of the table from which you are selecting (or has no default schema).
For example: Say you have 2 schemas in your database, dbo
and reports
. Your database user was setup with a default schema of dbo
. If you have a table in a reports
schema reports.table1
, and there is not a synonym in the dbo
schema for dbo.table1
that points to reports.table1
, then you will get this error if you do not specify the schema when selecting the field name.
NOTE: this appears to work in SQL 2008 R2, but when I tested in SQL 2005 then I received the error:
Msg 4104, Level 16, State 1, Line 1 The multi-part identifier
«TestTable.TestField» could not be bound.
You can check the default schema for your user by using this query:
select p.name, p.default_schema_name
from sys.database_principals p
order by p.name
A way to get around this is by using table alias’ in your query, or to specify the full path to the table as you mentioned in OP.
select t.[FieldName]
from [SchemaName].[TableName] as t
Необходимо написать хранимую процедуру, которая увеличивает комиссионные у тех продавцов, сумма продаж которых превышает среднюю сумму продаж всей компании. В написанной мной процедуре отображается ошибка (Не удалось привязать составной идентификатор «a.sum_zakaz».)
Помогите пожалуйста разобраться, что является причиной данной ошибки?
Скрипт:
create procedure comis_plus
@value decimal
as
update prodavec
set comis_prod=comis_prod+@value
where avg(a.sum_zakaz)<(select sum(a.sum_zakaz)
from zakaz a, prodavec b
where a.id_prod=b.id_prod)
Kromster
13.5k12 золотых знаков43 серебряных знака72 бронзовых знака
задан 15 окт 2020 в 21:26
Так сделайте, у вас обновляется продавец но нет условий на фильтрацию с этой таблицей
create procedure comis_plus
@value decimal
@avgsum decimal
as
-- вычислите среднюю сумму продаж всей компании
SELECT @avgsum = avg(sum_zakaz) FROM zakaz
-- далее имея значение можно не извращяться запросами
update zakaz
set comis_prod=zakaz.comis_prod+@value
where zakaz.id_prod in (select a.id_prod
from zakaz a, prodavec b
where a.id_prod=b.id_prod
GROUP BY a.id_prod
having @avgsum < sum(a.sum_zakaz)
)
UPD.Изменил процедуру добавил коментариев
ответ дан 16 окт 2020 в 5:30
Aziz UmarovAziz Umarov
22.4k2 золотых знака10 серебряных знаков32 бронзовых знака
4
Мне кажется — я не проверял — что поменять надо вот что:
where avg(zakaz.sum_zakaz)<(select sum(a.sum_zakaz)
from zakaz a, prodavec b
where a.id_prod=b.id_prod)
То есть, синоним a для zakaz относится только к выражению в скобках
ответ дан 15 окт 2020 в 22:17
S.H.S.H.
10.8k1 золотой знак19 серебряных знаков40 бронзовых знаков
5
YoHnA 0 / 0 / 0 Регистрация: 31.08.2015 Сообщений: 47 |
||||
1 |
||||
Составной идентификатор04.10.2016, 15:42. Показов 7052. Ответов 2 Метки нет (Все метки)
Доброго времени суток. Я все еще нуб в MSSQL. Есть таблица SF, в ней столбец Stage, в котором лежат текстовые данные. Они постоянно повторяются, так что было решено сделать по ним справочник Stage — ID и, собственно, Stage. Справочник был составлен при помощи группировки столбца Stage из SF, т.е. несовпадения исключены.
Пишет «Не удалось привязать составной идентификатор «dbo.Stage.Stage»»
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
04.10.2016, 15:42 |
2 |
iap 1109 / 754 / 182 Регистрация: 27.11.2009 Сообщений: 2,249 |
||||
04.10.2016, 15:55 |
2 |
|||
Решение YoHnA, таблицы определяются во FROMе. Только для той, которую апдейтите, FROM необязателен.
Однако, я не понял, какого типа dbo.SF.Stage и dbo.Stage.ID? P.S. Что вы называете «составным идентификатором» в названии темы?
1 |
0 / 0 / 0 Регистрация: 31.08.2015 Сообщений: 47 |
|
04.10.2016, 16:05 [ТС] |
3 |
Однако, я не понял, какого типа dbo.SF.Stage и dbo.Stage.ID? nvarchar и int соответственно. Ничего не смешивала, просто тыкала пальцем в небо наугад.
В dbo.SF тоже надо создать числовое поле, например, StageID, и заполнить его UPDATEом. Я думаю в данный момент об этом, ибо все равно придется внешний ключ цеплять. Спасибо! Раньше ни разу не доводилось использовать from в апдейте.
0 |
MSSQL Как исправить ошибку Не удалось связать составной идентификатор
Я видел похожие ошибки на 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;
- Есть ли
phuongxa
таблица включает столбецmaxa
? - 1 Что произойдет, если вы добавите группу maxa, tang — сразу после 5 сентября 2011 года.
- Да, было. Если я разделю запрос на 2 подзапроса, он будет работать нормально
- Похоже, вы выполняете не ту базу данных. Добавьте оператор «USE [имя базы данных]» в начало запроса и посмотрите, по-прежнему ли вы получаете ошибку.
- 1 Нет, как я сказал выше, если я разделю запрос на 2 отдельных запроса, он выполнится нормально.
Вы смешиваете неявные соединения с явными соединениями. Это разрешено, но вы должны знать, как это делать правильно.
Дело в том, что явные объединения (те, которые реализованы с использованием JOIN
ключевое слово) имеют приоритет над неявными (объединение «запятая», где условие объединения указано в WHERE
пункт).
Вот краткое описание вашего запроса:
SELECT … FROM a, b LEFT JOIN dkcd ON … WHERE …
Вы, вероятно, ожидаете, что он будет вести себя так:
SELECT … FROM (a, b) LEFT JOIN dkcd ON … WHERE …
то есть комбинация таблиц a
а также b
соединяется со столом dkcd
. На самом деле то, что происходит,
SELECT … FROM a, (b LEFT JOIN dkcd ON …) WHERE …
то есть, как вы, возможно, уже поняли, dkcd
присоединяется специально против b
и только b
, то результат соединения объединяется с a
и отфильтровали дальше с WHERE
пункт. В этом случае любая ссылка на a
в ON
пункт недействителен, a
неизвестно на тот момент. Вот почему вы получаете сообщение об ошибке.
На вашем месте я, вероятно, попытался бы переписать этот запрос, и одним из возможных решений могло бы быть:
SELECT DISTINCT a.maxa, b.mahuyen, a.tenxa, b.tenhuyen, ISNULL(dkcd.tong, 0) AS tongdkcd FROM phuongxa a INNER JOIN quanhuyen b ON LEFT(a.maxa, 2) = b.mahuyen 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' ORDER BY a.maxa
Здесь таблицы a
а также b
сначала соединяются, затем результат соединяется с dkcd
. По сути, это тот же запрос, что и ваш, только с использованием другого синтаксиса для одного из объединений, что имеет большое значение: ссылка a.maxa
в dkcd
Теперь условие соединения абсолютно корректно.
Как правильно заметил @Aaron Bertrand, вам, вероятно, следует подходить maxa
с определенным псевдонимом, возможно a
, в ORDER BY
пункт.
- ORDER BY maxa все еще неоднозначен, не так ли? Также я был бы осторожен с датой «1 сентября 2011 года», она не будет работать с другими языковыми / региональными настройками.
- @Aaron: Согласен по поводу
ORDER BY maxa
, Благодарность. Что касается дат, я считаю, что именно так OP решил указать их в своей среде. - «явные соединения … имеют приоритет над неявными» — не могли бы вы процитировать это, пожалуйста? например это определено в стандартах SQL или это особенность продукта? Спасибо.
- 1 @onedaywhen: Боюсь, это пока не более чем наблюдение с моей стороны. Меня несколько успокаивает тот факт, что я не первый, кто говорит здесь о приоритете объединений, но кроме этого, я был бы рад сам найти какое-либо официальное подтверждение.
- 1 В моем случае я забыл поставить пробелы при объединении строк для построения sql, поэтому ‘FROM dbo.table_a a’ + ‘INNER JOIN dbo.table_b b’ стало ‘FROM dbo.table_a aINNER JOIN dbo.table_b b’ , и он запутался и дал мне это сообщение об ошибке. Подробности, подробности, подробности.
Иногда эта ошибка возникает, когда вы неправильно используете схему (dbo) в запросе.
например, если вы напишете:
select dbo.prd.name from dbo.product prd
вы получите ошибку.
В этой ситуации измените его на:
select prd.name from dbo.product prd
- 1 Это довольно раздражает, и мне потребовалось слишком много времени, чтобы понять это. Спасибо. Самая неприятная часть — иногда он придирается к этому, но иногда проходит нормально.
если вы дали имя союзникам, измените его на настоящее имя
например
SELECT A.name,A.date FROM [LoginInfo].[dbo].[TableA] as A join [LoginInfo].[dbo].[TableA] as B on [LoginInfo].[dbo].[TableA].name=[LoginInfo].[dbo].[TableB].name;
измените это на
SELECT A.name,A.date FROM [LoginInfo].[dbo].[TableA] as A join [LoginInfo].[dbo].[TableA] as B on A.name=B.name;
- 1 Также, если вы создаете строку sql, следите за отсутствием конечных пробелов в конце строки. Он преобразовал мой псевдоним M в MINNER, когда он присоединился к следующей строке INNER JOIN ниже. Профилировщик SQL, показывающий выполненную строку, помог решить мою проблему. (Прокомментировано здесь, поскольку это связано с проблемой псевдонима v с фактическим именем)
- вау @Simon, спасибо, я даже не подумал об этом и бился головой о стену, пытаясь понять, почему мой запрос не работал, мне не хватало пробела в конце одного из символов возврата каретки!
- Это решило проблему, спасибо!
Я боролся с тем же сообщением об ошибке в SQL SERVER, так как у меня было несколько объединений, меняя порядок соединений решил это за меня.
В моем случае проблема оказалась в псевдониме, который я дал таблице. «oa» кажется неприемлемым для SQL Server.
У меня была такая же ошибка от JDBC. Все проверил, и мой запрос был в порядке. Оказалось, в предложении where у меня есть аргумент:
where s.some_column = ?
И значение аргумента, которое я передавал, было нулевым. Это также дает ту же ошибку, которая вводит в заблуждение, потому что при поиске в Интернете вы обнаруживаете, что что-то не так со структурой запроса, но это не в моем случае. Просто подумал, что кто-то может столкнуться с той же проблемой
Что сработало для меня, так это изменить мое предложение WHERE на подзапрос SELECT
ИЗ:
DELETE FROM CommentTag WHERE [dbo].CommentTag.NoteId = [dbo].FetchedTagTransferData.IssueId
Кому:
DELETE FROM CommentTag WHERE [dbo].CommentTag.NoteId = (SELECT NoteId FROM FetchedTagTransferData)
Я новичок в SQL, но столкнулся с этой проблемой в ходе прохождения курса и обнаружил, что назначение запроса проекту специально помогло устранить ошибку, состоящую из нескольких частей. Например, созданный мной проект был CTU SQL Project, поэтому я убедился, что я начал свой скрипт с USE [CTU SQL Project] в качестве первой строки, как показано ниже.
USE [CTU SQL Project] SELECT Advisors.First_Name, Advisors.Last_Name...and so on.
- 1 Когда вы говорите «проект», я предполагаю, что вы имеете в виду базу данных, а не проекцию. Оператор use просто изменяет базу данных, на которую вы накладываете запрос.
- Да, проект Charleh, как в базе данных, над которой я работал. Я не был уверен, что я делал не так с моей базой данных, но указание «использовать» и конкретную базу данных для области действия устранило мою ошибку.
Если эта ошибка возникает в UPDATE
, дважды проверьте JOIN
в таблице со столбцом / полем, вызывающим ошибку.
В моем случае это было из-за отсутствия JOIN
сам, который генерировал ту же ошибку из-за неизвестного поля (как указал Андрей).
Вместо этого вы можете попробовать объединить такие таблицы, как,
select .... from dkcd right join a , b
Это должно работать
SELECT DISTINCT phuongxa.maxa , quanhuyen.mahuyen , phuongxa.tenxa , quanhuyen.tenhuyen , ISNULL(dkcd.tong, 0) AS tongdkcd FROM phuongxa , quanhuyen LEFT OUTER JOIN ( SELECT khaosat.maxa , COUNT(*) AS tong FROM khaosat WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011' AND 'Sep 5 2011' GROUP BY khaosat.maxa ) AS dkcd ON dkcd.maxa = maxa WHERE phuongxa.maxa <> '99' AND LEFT(phuongxa.maxa, 2) = quanhuyen.mahuyen ORDER BY maxa;
- Используйте сами имена таблиц вместо псевдонимов, если возникает проблема с привязкой к нескольким частям.
Моя ошибка заключалась в использовании поля, которого не было в таблице.
table1.field1 => не существует
table2.field1 => правильно
Исправьте имя вашей таблицы.
моя ошибка произошла из-за использования WITH
WITH RCTE AS ( SELECT... ) SELECT RCTE.Name, ... FROM RCTE INNER JOIN Customer ON RCTE.CustomerID = Customer.ID
при использовании в сочетании с другими таблицами …
Вы забыли присоединиться к некоторым столам? В противном случае вам, вероятно, потребуется использовать псевдонимы.
Я также боролся с этой ошибкой и в конечном итоге использовал ту же стратегию, что и ответ. Я привожу свой ответ, чтобы подтвердить, что эта стратегия должна работать.
Вот пример, в котором я сначала выполняю одно внутреннее соединение между двумя таблицами, которые, как я знаю, получил данные, а затем два левых внешних соединения для таблиц, которые могут иметь соответствующие строки, которые могут быть пустыми. Вы смешиваете внутренние и внешние соединения, чтобы получить результаты с данными по таблицам, вместо того, чтобы использовать синтаксис по умолчанию, разделенный запятыми, между таблицами и пропускать строки в желаемом соединении.
use somedatabase go select o.operationid, o.operatingdate, p.pasid, p.name as patientname, o.operationalunitid, f.name as operasjonsprogram, o.theaterid as stueid, t.name as stuenavn, o.status as operasjonsstatus from operation o inner join patient p on o.operationid = p.operationid left outer join freshorganizationalunit f on f.freshorganizationalunitid = o.operationalunitid left outer join theater t on t.theaterid = o.theaterid where (p.Name like '%Male[0-9]%' or p.Name like '%KFemale [0-9]%')
Во-первых: выполните внутренние соединения между таблицами, которые, как вы ожидаете, будут соответствовать данным. Вторая часть: продолжайте внешние соединения, чтобы попытаться получить данные из других таблиц, но это не отфильтрует ваш набор результатов, если внешнее соединение таблицы не имеет соответствующих данных или не соответствует условию, которое вы установили в предикате / условии on.
Эта ошибка также может быть вызвана просто отсутствием запятой. ,
между именами столбцов в операторе SELECT.
например:
SELECT MyCol1, MyCol2 MyCol3 FROM SomeTable;
- Если
SELECT MyCol1, MyCol2, MyCol3 FROM SomeTable;
работает, то я не понимаю, какSELECT MyCol1, MyCol2 MyCol3 FROM SomeTable;
могу дать вам любой ошибка, не говоря уже о той, что в заголовке этого вопроса. Если в вашем примере есть что-то, что бросается в глаза, в этом случае я предполагаю, что это не будет просто отсутствует запятая. Как вы думаете, можно ли придумать простой сценарий, воспроизводящий проблему, о которой вы говорите? Вот где я попытался просто опустить запятую, но это все равно сработало (= ошибки не было): dbfiddle.uk/… - @AndriyM Единственное, о чем я могу думать, это то, что мой запрос, вероятно, был более сложным (возможно, с соединениями, извините, давным-давно). Но я уверен, что исправление для сообщения об ошибке, которое я получил (которое могло или не могло быть точно как в заголовке OP) нужно было просто поставить пропущенную запятую!
Tweet
Share
Link
Plus
Send
Send
Pin
Что такое «многосоставный идентификатор» и почему он не может быть привязан?
Я постоянно получаю эти ошибки, когда я пытаюсь обновить таблицу на основе другой таблицы. Я в конечном итоге переписываю запрос, изменяю порядок соединений, изменяю некоторые группировки, а затем он в конечном итоге работает, но я просто не совсем понимаю его.
что такое «многосоставный идентификатор»?
Когда является составной идентификатор не может быть привязан?
Что это все равно неизбежно?
В каких случаях произойдет эта ошибка?
Каковы наилучшие способы предотвратить это?
конкретная ошибка от SQL Server 2005 является:
составной идентификатор «…»не может быть связан.
вот пример:
UPDATE [test].[dbo].[CompanyDetail]
SET Mnemonic = [dbBWKMigration].[dbo].[Company].[MNEMONIC],
[Company Code] = [dbBWKMigration].[dbo].[Company].[COMPANYCODE]
WHERE [Company Name] = **[dbBWKMigration].[dbo].[Company].[COMPANYNAME]**
фактическая ошибка:
Msg 4104, Уровень 16, состояние 1, строка 3 многосоставный идентификатор
«dbBWKMigration.ДБО.Компания.COMPANYNAME » не может быть связан.
484
14
14 ответов:
составной идентификатор — это любое описание поля или таблицы, содержащее несколько частей, например MyTable.Так или иначе — если он не может быть связан, это означает, что с ним что-то не так-либо у вас есть простая опечатка, либо путаница между таблицей и столбцом. Это также может быть вызвано использованием зарезервированных слов в именах таблиц или полей и не окружать их [].
что-то вроде redgate SQL prompt гениально для избежания вручную введите их (он даже автоматически завершает соединения на основе внешних ключей), но не является бесплатным. SQL server 2008 поддерживает intellisense из коробки, хотя это не совсем так полно, как версия redgate.
на самом деле иногда, когда вы обновляете одну таблицу из данных другой таблицы, я думаю, что одна из распространенных проблем, вызывающих эту ошибку, заключается в том, что вы неправильно используете аббревиатуры таблиц или когда они не нужны. Правильное утверждение находится ниже:
Update Table1 Set SomeField = t2.SomeFieldValue From Table1 t1 Inner Join Table2 as t2 On t1.ID = t2.ID
обратите внимание, что
SomeField
С Таблица1 нетt1
квалификаторомt1.SomeField
но это простоSomeField
.если кто-то пытается чтобы обновить его, указав
t1.SomeField
оператор вернет многосоставную ошибку, которую вы заметили.
Это, вероятно, опечатка. Найдите места в коде, где вы вызываете [schema].[TableName] (в основном везде, где вы ссылаетесь на поле) и убедитесь, что все написано правильно.
лично я стараюсь избегать этого, используя псевдонимы для всех моих таблиц. Это очень помогает, когда вы можете сократить длинное имя таблицы до аббревиатуры его описания (т. е. WorkOrderParts -> WOP), а также делает ваш запрос более читаемым.
Edit: в качестве дополнительного бонуса вы сохраните Тонны нажатий клавиш, когда все, что вам нужно ввести,-это трех-или четырехбуквенный псевдоним по сравнению со схемой, таблицей и именами полей вместе.
Binding = ваше текстовое представление определенного столбца сопоставляется с физическим столбцом в некоторой таблице, в некоторой базе данных, на некотором сервере.
составной идентификатор может быть: MyDatabase.ДБО.таблица MyTable. Если вы получаете любой из этих идентификаторов неправильно, то у вас есть составной идентификатор, который не может быть сопоставлен.
лучший способ избежать этого-написать запрос правильно в первый раз или использовать плагин для Management studio, который предоставляет intellisense и таким образом помогает вам избегая опечаток.
Если вы уверены, что это не опечатка по орфографии, возможно, это опечатка по регистру.
какие параметры сортировки вы используете? Это проверить.
при обновлении таблиц убедитесь, что вы не ссылаетесь на поле вашего обновления через псевдоним.
у меня просто была ошибка со следующим кодом
update [page] set p.pagestatusid = 1 from [page] p join seed s on s.seedid = p.seedid where s.providercode = 'agd' and p.pagestatusid = 0
мне пришлось удалить ссылку на псевдоним в инструкции set, чтобы она читалась так
update [page] set pagestatusid = 1 from [page] p join seed s on s.seedid = p.seedid where s.providercode = 'agd' and p.pagestatusid = 0
я обнаружил, что я получаю их много, когда я пытаюсь сократить, например:
Table1 t1, Table2 t2 where t1.ID = t2.ID
изменить его на:
Table1, Table2 where Table1.ID = Table2.ID
делает запрос работать и не выбрасывать ошибку.
У вас, наверное, опечатка. Например, если у вас есть таблица с именем Customer в базе данных Sales, вы можете ссылаться на нее как на Sales..Клиент (хотя лучше ссылаться на него, включая имя владельца (dbo является владельцем по умолчанию), как продажи.ДБО.Клиент.
Если вы набрали от продаж…Клиент, вы могли бы получить сообщение, которое вы получили.
У меня была эта проблема, и она оказалась неправильным псевдонимом таблицы. Исправление этого решило проблему.
мой ставил схему на псевдоним таблицы по ошибке:
SELECT * FROM schema.CustomerOrders co WHERE schema.co.ID = 1 -- oops!
Я
P.PayeeName AS 'Payer' --,
и две строки комментария бросили эту ошибку
Я на самом деле забыл присоединиться к таблице с другими, поэтому я получил ошибку
должно быть:
CREATE VIEW reserved_passangers AS SELECT dbo.Passenger.PassName, dbo.Passenger.Address1, dbo.Passenger.Phone FROM dbo.Passenger, dbo.Reservation, dbo.Flight WHERE (dbo.Passenger.PassNum = dbo.Reservation.PassNum) and (dbo.Reservation.Flightdate = 'January 15 2004' and Flight.FlightNum =562)
а не так:
CREATE VIEW reserved_passangers AS SELECT dbo.Passenger.PassName, dbo.Passenger.Address1, dbo.Passenger.Phone FROM dbo.Passenger, dbo.Reservation WHERE (dbo.Passenger.PassNum = dbo.Reservation.PassNum) and (dbo.Reservation.Flightdate = 'January 15 2004' and Flight.FlightNum = 562)
Код Ошибки
FROM dbo.Category C LEFT OUTER JOIN dbo.SubCategory SC ON C.categoryID = SC.CategoryID AND C.IsActive = 'True' LEFT OUTER JOIN dbo.Module M ON SC.subCategoryID = M.subCategoryID AND SC.IsActive = 'True' LEFT OUTER JOIN dbo.SubModule SM ON M.ModuleID = SM.ModuleID AND M.IsActive = 'True' AND SM.IsActive = 'True' LEFT OUTER JOIN dbo.trainer ON dbo.trainer.TopicID =dbo.SubModule.subModuleID
Код Решения
FROM dbo.Category C LEFT OUTER JOIN dbo.SubCategory SC ON C.categoryID = SC.CategoryID AND C.IsActive = 'True' LEFT OUTER JOIN dbo.Module M ON SC.subCategoryID = M.subCategoryID AND SC.IsActive = 'True' LEFT OUTER JOIN dbo.SubModule SM ON M.ModuleID = SM.ModuleID AND M.IsActive = 'True' AND SM.IsActive = 'True' LEFT OUTER JOIN dbo.trainer ON dbo.trainer.TopicID = SM.subModuleID
как вы можете видеть, в коде ошибки,
dbo.SubModule
уже определен как SM, но я используюdbo.SubModule
в следующей строке, поэтому произошла ошибка.
используйте объявленное имя вместо фактического имени. Проблема решена.
мой лучший совет при наличии ошибки-использовать [] braquets для сортировки имен таблиц, аббревиатура таблиц иногда вызывает ошибки (иногда аббревиатуры таблиц просто работают нормально…странно)