Ошибка не удалось привязать составной идентификатор

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's user avatar

Kromster

13.5k12 золотых знаков43 серебряных знака72 бронзовых знака

задан 15 окт 2020 в 21:26

user393275's user avatar

Так сделайте, у вас обновляется продавец но нет условий на фильтрацию с этой таблицей

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 Umarov's user avatar

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 user avatar

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, т.е. несовпадения исключены.
Далее хочу заменить в SF значения в Stage на их айдишники из справочника Stage

T-SQL
1
update dbo.SF set dbo.SF.Stage=dbo.Stage.ID where dbo.SF.Stage=dbo.Stage.Stage

Пишет «Не удалось привязать составной идентификатор «dbo.Stage.Stage»»
Пробовала переформатировать Stage.ID из инта в нварчар, не помогло, ошибка та же.
Таблицы никак не связаны, и в первой, и во второй ключевое поле ID, не составное.
Помогите, пожалуйста.



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 как решение

Решение

YoHnA, таблицы определяются во FROMе. Только для той, которую апдейтите, FROM необязателен.
Хотя, удобно назначить ей алиас, а это тоже только во FROMе делать надо.
Следите за руками:

T-SQL
1
2
3
4
UPDATE F
SET F.Stage=S.ID
FROM dbo.SF F
JOIN dbo.Stage S ON F.Stage=S.Stage;

Однако, я не понял, какого типа dbo.SF.Stage и dbo.Stage.ID?
Зачем смешивать строковый тип и числовой?
В dbo.SF тоже надо создать числовое поле, например, StageID, и заполнить его UPDATEом.
А dbo.SF.Stage не трогать (или вообще удалить)

P.S. Что вы называете «составным идентификатором» в названии темы?



1



0 / 0 / 0

Регистрация: 31.08.2015

Сообщений: 47

04.10.2016, 16:05

 [ТС]

3

Цитата
Сообщение от iap
Посмотреть сообщение

Однако, я не понял, какого типа dbo.SF.Stage и dbo.Stage.ID?

nvarchar и int соответственно. Ничего не смешивала, просто тыкала пальцем в небо наугад.

Цитата
Сообщение от iap
Посмотреть сообщение

В dbo.SF тоже надо создать числовое поле, например, StageID, и заполнить его UPDATEом.
А dbo.SF.Stage не трогать (или вообще удалить)

Я думаю в данный момент об этом, ибо все равно придется внешний ключ цеплять.

Спасибо! Раньше ни разу не доводилось использовать 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 для сортировки имен таблиц, аббревиатура таблиц иногда вызывает ошибки (иногда аббревиатуры таблиц просто работают нормально…странно)

Понравилась статья? Поделить с друзьями:
  • Ошибка не удалось правильно определить размер диска
  • Ошибка не удалось получить файл
  • Ошибка не удалось получить канонический путь cow
  • Ошибка не удалось получить доступ к сайту
  • Ошибка не удалось получить доступ к рекомендациям