2012-11-26 5 views
3

다음 코드 : 오류가이 구문이 유효하지 않은 이유는 무엇입니까?

SELECT JaguarStartupTime, CPU, AmountOfRam, UpdatedOn, * 
FROM dbo.MachineConfiguration 
WHERE ServerName = 'WashingtonDC01' 
AND UpdatedOn > '11/21/2012' 
ORDER BY JaguarStartupTime DESC 

결과 : Ambiguous column name 'JaguarStartupTime'.

그러나 ORDER BY을 제거하면 문제가 없습니다. 또한, 아래와 같이, 너무 작동하게 테이블로 ORDER BY 절을 접두어 :

SELECT JaguarStartupTime, CPU, AmountOfRam, UpdatedOn, * 
FROM dbo.MachineConfiguration 
WHERE ServerName = 'WashingtonDC01' 
AND UpdatedOn > '11/21/2012' 
ORDER BY dbo.MachineConfiguration.JaguarStartupTime DESC 

이 나에게 의미하지 않는다. 누군가 설명 할 수 있습니까?

답변

8

쿼리에 * (모든 열)이 SELECT 절에 포함되어 있으며 JaguarStartupTime 열도 포함되어 있기 때문입니다.

평신도의 말 : 결과를 검색 할 때 열이 두 번 나타나고 서버가 정렬 순서를 적용하려고하면 참조 할 열이 확실하지 않습니다.

필자는 개인적으로 열 이름의 긴 목록을 나열하더라도 쿼리에서 *의 사용을 제거하도록 쿼리를 변경했습니다. 그것은 best practice이고,이 문제를 피할 수 있습니다.


는 접두사 때 작동하는 이유에 관해서는, 나는 MSDN documentation이 발견 :

In SQL Server, qualified column names and aliases are resolved to columns listed in the FROM clause. If order_by_expression is not qualified, the value must be unique among all columns listed in the SELECT statement.

이 단순히 실행 계획으로 SQL 문으로 변환하는 DB 엔진의 기본 메커니즘의 일부입니다.

+0

아아! 너 더 빨랐어! ;-) 내 대답을 지우고 +1. –

+1

서버는 그것이 같은 열임을 알고 있습니다. 예를 들어 JaguarStartupTime을 WHERE 절에 추가하면 두 개의 동일한 열이 있음에도 불구하고 행복하게 필터링됩니다. – AngryHacker

+1

@AngryHacker -'WHERE'는'FROM' 다음에'SELECT' 전에 처리됩니다. 'ORDER'는'SELECT' 다음에 발생합니다. (이 모든 주문은 "마치 같다"- 결과가 동일하면 엔진이 이러한 작업을 다시 주문할 수 있습니다.) –

1

귀하의 질문에있는 경우 ORDER BY JaguarStartupTime은 투영 된 열이 실제로 동일한 기본 열을 참조하므로 실제로 모호하지 않음에 동의합니다.

그러나 일반적인 경우에는 이것이 사실이라는 보장은 없습니다. As discussed in the response to this connect item. 예를 들어, 다음 질의에서 어떤 것이 사용될 것인지 명확하게 모호하다. 구문 검증 목적

SELECT JaguarStartupTime, 
     CPU AS JaguarStartupTime 
FROM dbo.MachineConfiguration 
ORDER BY JaguarStartupTime DESC 

SQL 서버들은 정말 모호인지 여부를 확인하기 위해 열 이름의 분석을 수행하지 않습니다. 투영 된 열 이름 목록에있는 some_name의 주문시 some_name은 고유해야합니다. 이 테이블 이름이 그것을 할 수 있도록 소스 컬럼 이름이 아닌 투영 된 열 이름으로 주문하는 SQL Server에 보장과 열 이름을 예선 the ANSI spec

If a <sort specification> contains a <column name> , then T shall contain exactly one column with that <column name> and the <sort specification> identifies that column.

에 따라입니다.

SELECT name, name 
FROM master..spt_values v1 
ORDER BY v1.name 

또한 다음 쿼리가 허용됩니다. ORDER BY 절에 열 별칭 만 스스로가 아닌 표현식에서 사용할 수 있기 때문에 name는 별칭으로 해석 할 수없는 및 해석해야 위의 쿼리 있도록

select name, name 
FROM master..spt_values v1 
ORDER BY name + '' 

이 모호없는 이유는 v1.name으로 주문하십시오.

관련 문제