2013-05-02 18 views
9

Mam kwerendy SQL, który nie wykona:Dlaczego to zapytanie SQL powoduje błąd "Niejednoznaczna nazwa kolumny"?

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

tabela Person ma PK PersonID (int). Widok PotentiallyFraudulentPeople jest zapytaniem tabeli Person połączonej z innymi tabelami, aby zdecydować, czy ufamy danej osobie, czy nie. Widok PotentiallyFraudulentPeople ma tylko jedną kolumnę: PersonID.

Kiedy próbuję wykonać to zapytanie, otrzymuję ten błąd:

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

Rozumiem, że błąd ten mówi mi, że nazwa CreatedDate kolumna jest niejednoznaczne i muszę poprzedzić go z aliasu mojego stołu, "p".

Ta kwerenda działa:

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

Co ja nie rozumiem, dlaczego muszę użyć „p” alias w rachunku ORDER BY i nie ma na liście SELECT kolumny. Ponadto nie rozumiem, dlaczego muszę w ogóle używać aliasu tabeli, ponieważ w widoku PotentiallyFraudulentPeople nie ma nawet kolumny CreatedDate.

Czy ktoś może wyjaśnić to dziwne zachowanie?

Używam programu SQL Server 2008 i SSMS do wykonania zapytania.

UPDATE
Również próbowałem usunięciu kolumny CreatedDate z mojej listy SELECT kolumny, a następnie zapytanie nie wymaga „p” alias w ORDER BY. Tak więc to zapytanie działa również:

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

Odpowiedz

31

Wybieramy kolumnę CreatedDate dwa razy.

  1. Wyraźnie za pośrednictwem CreatedDate.
  2. Najpewniej za pośrednictwem *.

Nie wie, na którym zdarzeniu chcesz sortować - i oczywiście nie zdaje sobie sprawy, że oba wystąpienia odnoszą się do tej samej kolumny.

+0

brzmi to jak dziwne zachowanie programu SQL Server, ale to wyjaśnia mój problem. Dzięki! Przyjmuję tę odpowiedź tak szybko, jak tylko mogę. –

+0

Po prostu miałem ten problem i to była przyczyna, nie zdawałem sobie sprawy, że to był problem z zamówieniem przez – MichaelF

5

Powód, dla którego nazwa jest niejednoznaczna związany jest z tym, że klauzula order by pozwala na użycie nazw aliasów, więc p.CreateDt i * .CreateDt oba aliasy do CreateDt. Ponieważ zamówienie przez alias zezwala na nazwy, nie może rozstrzygnąć:

0

Musisz określić, z której tabeli pochodzi funkcja CreateDate. Oznacza to, że masz tę nazwę kolumny w obu tabelach. Tak więc p.CreatedDate lub pfp.CreatedDate.

+0

FYI, odpowiadasz na pytanie, na które odpowiedziano 4 lata temu. Należy pamiętać o dacie wysłania wiadomości. – jjjjjjjjjjj

0

Możesz dodać alias do „CreatedDate” i sortować je korzystając z aliasu

select 
    p.PersonID, 
    CreatedDate [create_date], 
    * 
from 
    dbo.Person p join 
    dbo.PotentiallyFraudulentPeople pfp on p.PersonID= pfp.PersonID 
order by 
    [create_date] 
Powiązane problemy