2013-05-02 3 views
9

У меня есть запрос SQL, который не в состоянии выполнить:Почему этот SQL-запрос вызывает ошибку «Неоднозначное имя столбца»?

select p.PersonID, CreatedDate, * from dbo.Person p 
join dbo.PotentiallyFraudulentPeople pfp on p.PersonID= pfp.PersonID 
order by CreatedDate 

Таблица Person имеет рК PersonID (INT). Представление PotentiallyFraudulentPeople представляет собой запрос таблицы Person, соединенной с некоторыми другими таблицами, чтобы решить, доверяем ли мы человеку или нет. У PotentiallyFraudulentPeople вид только один столбец: PersonID.

Когда я пытаюсь выполнить этот запрос, я получаю эту ошибку:

Msg 209, Level 16, State 1, Line 3
Ambiguous column name 'CreatedDate'.

Я понимаю, что эта ошибка говорит мне, что имя CreatedDate столбца неоднозначно, и мне нужно предварить его псевдоним моего стола, 'п'.

Этот запрос работает:

select p.PersonID, CreatedDate, * from dbo.Person p 
join dbo.PotentiallyFraudulentPeople pfp on p.PersonID= pfp.PersonID 
order by p.CreatedDate 

То, что я не понимаю, почему я должен использовать «р» псевдоним в ORDER BY заявления, а не в списке SELECT колонка. Кроме того, я не понимаю, почему мне нужно использовать псевдоним таблицы вообще, поскольку в представлении PotentiallyFraudulentPeople даже нет столбца CreatedDate.

Может ли кто-нибудь объяснить это странное поведение?

Я использую SQL Server 2008 и SSMS для выполнения запроса.

UPDATE
Кроме того, я попытался удалить CreatedDate столбец из моего списка SELECT столбца, а затем запрос больше не требует «р» псевдонима в ORDER BY. Так что этот запрос работает так:

select p.PersonID, * from dbo.Person p 
join dbo.PotentiallyFraudulentPeople pfp on p.PersonID= pfp.PersonID 
order by CreatedDate 

ответ

31

Вы выбираете CreatedDate колонку дважды.

  1. Явно через CreatedDate.
  2. Неявно через *.

Он не знает, какое происхождение вы хотите отсортировать, и, очевидно, не понимает, что оба входа относятся к одному столбцу.

+0

Это звучит как странное поведение для SQL Server, но это объясняет мою проблему. Благодаря! Я приму этот ответ, как только смогу. –

+0

Просто была эта проблема, и это было причиной, не понимал, что это была проблема с заказом на – MichaelF

5

И причина, по которой это имя неоднозначно, связано с тем, что предложение order by позволяет использовать псевдонимы, поэтому p.CreateDt и * .CreateDt оба являются псевдонимами для CreateDt. Поскольку порядок с помощью имен псевдонимов не может быть разрешен

0

Вы должны указать, из какой таблицы был создан CreateDate. Это означает, что у вас есть это имя столбца в обеих таблицах. Таким образом, либо p.CreatedDate, либо pfp.CreatedDate.

+0

FYI, вы отвечаете на вопрос, на который был дан ответ 4 года назад. Имейте в виду дату публикации, когда вы отвечаете. – jjjjjjjjjjj

0

Вы можете добавить псевдоним «CreatedDate» и сортировать его с помощью псевдонима

select 
    p.PersonID, 
    CreatedDate [create_date], 
    * 
from 
    dbo.Person p join 
    dbo.PotentiallyFraudulentPeople pfp on p.PersonID= pfp.PersonID 
order by 
    [create_date] 
Смежные вопросы