2014-12-08 4 views
-2

Я получаю эту ошибку:Как я могу устранить эту ошибку SQL-запроса?

Мульти-часть идентификатора «dbo.Users.Id» не может быть привязан.

с моим запросом:

Select 
    dbo.Users.Name, 
    SUM(dbo.IncomeCategories.YearEstimation - dbo.ExpensCategories.YearBudget) 
From 
    Users, IncomeCategories 
inner join 
    dbo.ExpensCategories on dbo.Users.Id = dbo.ExpensCategories.Id 
where 
    Users.Id = 1 

Можете ли вы помочь мне решить эту проблему, пожалуйста?

+2

[Плохие привычки пинать: использование старого стиля JOIN и] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits- to-kick-using-old-style-joins.aspx) - этот стиль таблиц * в стиле старого стиля * разделен запятыми * был заменен на * правильный * ANSI 'JOIN' синтаксис в ANSI - ** 92 ** SQL Стандарт (** более 20 лет ** назад), и его использование не рекомендуется. Это особенно ** плохо, если вы * смешиваете два стиля *, как и вы, - используйте некоторые таблицы в списке, разделенном запятыми, и используйте правильный ANSI 'INNER JOIN' для другого объединения .... –

ответ

1

Вам необходимо изменить порядок ваших таблиц; JOIN имеет более высокий приоритет, чем запятая, поэтому, когда компилятор анализирует предложение JOIN, он еще не разобрал справочную таблицу Users. Вы можете исправить это, поставив Users таблицу непосредственно перед JOIN:

Select Users.Name,SUM(IncomeCategories.YearEstimation-ExpensCategories.YearBudget) 
From IncomeCategories, Users 
inner join ExpensCategories 
on 
Users.Id=ExpensCategories.Id 
where Users.Id=1 

Другие (потенциальных) проблем:

  • Будьте последовательны в вашей таблице ссылок. В некоторых местах вы используете dbo., а не другие; либо используйте его повсюду (если вам нужно , необходимо использовать для использования dbo.) или нигде (если вы этого не сделаете).

  • Вы не определяете отношения к таблице IncomeCategories, поэтому вы получите декартовую продукцию (которая может быть тем, что вы хотите, но это не ясно).

  • У вас есть СУМ без GROUP BY, поэтому вы получите сообщение об ошибке там, если вы не добавите GROUP BY Users.Name.

  • Присоединение Users.Id к ExpensCategories.Id кажется странным. Я бы ожидать ExpensCategories.UserId или что-то

+0

Я думаю, что SQL Server простят несогласованное именование. [не вызывает проблемы здесь] (http://www.sqlfiddle.com/#!6/d2fa3/3) Проблема, вероятно, в приоритете неявных и явных объединений http://stackoverflow.com/a/761599/73226 –

+1

@MartinSmith Я думаю, что вы правы - я поправлю свой ответ. –

+0

@MartinSmith Вы правы - изменение порядка таблиц должно устранить проблему. –

Смежные вопросы