2016-12-08 6 views
1

이 제목을 어떻게 발음할지 생각조차 할 수 없었습니다. 이것은 SQL Server 2005입니다.SSMS 2005 - 다른 결과를 반환하는 앤티 앨리어스가 적용된 열

열에 대한 별칭을 사용하여 동일한 쿼리를 수행 할 경우, 완전히 다른 결과를 얻습니다. 모호하지 않습니다.

예 쿼리 :

UPDATE MyTable 
SET  Col1 = Col1 - 1 
FROM DB.dbo.MyTable M 
WHERE EXISTS (SELECT * 
       FROM DB.dbo.SecondTable B WITH (NOLOCK) 
       WHERE B.Col2 = 12345678 
         AND B.Col3 = 1 
         AND B.M-FK = M.M-PK) 
     AND M.Col1 > 0 
     AND M.Col4 = 87654321; 

이 쿼리는 내가 직접 테이블에 모든 가정, 나는 상당한 수익을 얻을.

매우 유사한 쿼리,하지만 난 테이블을 지정하지

UPDATE MyTable 
SET  Col1 = Col1 - 1 
FROM DB.dbo.MyTable M 
WHERE EXISTS (SELECT * 
       FROM DB.dbo.SecondTable B WITH (NOLOCK) 
       WHERE Col2 = 12345678 
         AND Col3 = 1 
         AND B.M-FK = M.M-PK) 
     AND Col1 > 0 
     AND Col4 = 87654321; 

제 2 질의는 반환 1.

이 사이의 상호 열은 B-외래 키 => M.PrimaryKey

입니다

내 경험에 비추어 볼 때 항상 별칭에 열을 할당했지만 누군가가 위의 질문을 일찌감치 질문했을 때 혼란 스러웠습니다. 그들이 애매한 경우 SSMS는이를 거부합니다. 그러나 실제로 실행되었습니다.

그래서 나는 '어쩌면 그 열을 무시합니다'라고 생각했습니다. 그것은 이상합니다. 하지만 두 번째 행은 더 많은 혼란을 가져 오는 행을 반환합니다.

아무에게도 별칭과 비 별칭 쿼리가 변경되는 이유를 정확하게 설명 할 수 있습니까? 오류가 발생하는 이유는 무엇입니까?

답변

1

제 경험상, 테이블의 db 이름을 직접 참조하지 않습니다. 나는 항상 Alias ​​을 읽는 것이 더 쉽습니다. 또한 동일한 정확한 열 이름과 데이터 유형이 두 개 이상의 테이블에 걸쳐있는 경우 어떤 열을 참조하는지 확실히 알 수 있습니다. ...

UPDATE dbo.MyTable 
SET  Col1 = Col1 - 1 
WHERE EXISTS (SELECT * 
       FROM dbo.SecondTable AS b WITH (NOLOCK) 
       WHERE b.Col2 = 12345678 
         AND b.Col3 = 1 
         AND b.M-FK = M-PK) 
     AND Col1 > 0 
     AND Col4 = 87654321; 

의 문제를에 oppossed AS

UPDATE m 
SET  m.Col1 = m.Col1 - 1 
FROM dbo.MyTable AS m 
WHERE EXISTS (SELECT * 
       FROM dbo.SecondTable AS b WITH (NOLOCK) 
       WHERE b.Col2 = 12345678 
         AND b.Col3 = 1 
         AND b.M-FK = m.M-PK) 
     AND m.Col1 > 0 
     AND m.Col4 = 87654321; 

:

대신을 시도하고 같은 디자인은 향후 스틱 그리고 당신은 항상 당신이 기대하는 결과를 얻을 수 있습니다 두 번째 테이블 에 하나 이상의 동일한 열 정의가있는 경우 두 번째 테이블은 두 테이블간에 혼동을 일으킬 수 있습니다. 실제로 이러한 오류로 인해 실행되지 않을 수도 있습니다! 따라서 앨리어싱을 사용하면 어떤 테이블을 참조하는지 알 수 있으며 원하는 컬럼과 테이블 만 업데이트합니다.(SELECT 문) "냄비"는 선 (善)이 냄비 안쪽에있는 "주전자 냄비 커버"로 UPDATE의

생각한다

여기 팁입니다!

즉, 다음 FROM 절에서 그냥 SELECT처럼 것을

UPDATE a 
SET a.col1 = @value1, a.col2 = @value2, etc 
FROM dbo.myTable1 AS a 
    INNER JOIN dbo.myTable2 as b ON b.col3 = a.col3 
    INNER JOIN ...etc.. 
WHERE ..etc.. 

참고. 그리고 쿼리의 첫 번째 테이블을 업데이트 할 필요가 없습니다. 쿼리의 FROM 절에있는 논리에 영향을주지 않고 b 또는 UPDATE c 등을 업데이트 할 수 있습니다.

제 조언은 먼저 원하는 데이터를 가져 오도록 SELECT 쿼리를 작성한 다음 변경하려는 열에 따라 UPDATE & SET으로 SELECT를 바꾸는 것입니다. 그런 식으로 나는 변화하는 데이터의 관점에서 결코 혼란스럽지 않습니다.

나는이 방법으로 방대한 UPDATE SQL 문을 생성하고 거의 처음 작동하도록했습니다.

건배

+1

좋은 설명. 저는 항상 별칭에도 붙어 있습니다. 내 직원과 그의 스크립트를 비교했을 때이 질문을했던 직원이었습니다. 그에게 실제적인 대답이없고, 우리 둘다 'SQL이라고 가정합니다.'라는 식의 열은 특정 테이블이 나열되지 않아서 그의 위치를 ​​무시하고 있었지만 여전히 정확한 답변을 찾으려고했습니다. 그것은 단지 그러한 필드를 무시 SSMS 것 같습니다. 아직 그의 쿼리가 한 가지 결과를 얻었지만 실마리가 없다는 단서가 없습니다. 귀하의 회신에 기꺼이 동의합니다. – DNorthrup

+0

의견을 주셔서 감사합니다. 내 대답에 투표 할 수 있으면 @DNorthrup도 환영 할 것입니다. – Fandango68

0

열 참조가 모호한 경우 오류가 발생합니다. 이러한 쿼리는 나에게도 똑같이 보이지만, 술어 Col1 > 0은 감소 할 때마다 실행될 때마다 다른 행을 필터링 할 수 있습니다. 또한, B.M-FKB.M - B.FK으로 해석 될 것이므로 난독 화의 유물이라고 가정합니다. 나는 당신이 B.[M-FK] 또는 B.M_FK과 같은 것을 의미한다고 가정하고 있습니다.

나는 또한 (NOLOCK)을 참조한다. 기여할 수있는 데이터가 플럭스에 B 인 경우

+0

Hey Ben, 별칭을 사용하지 않는 3 줄을 제외하고는 똑같습니다. 위의 쿼리에서 자리 표시 자 이름을 사용했습니다. 그것들은 실제 이름이 아닙니다. B.M-FK는 B. [B] -Foreign Key를 의미하고, M.M-PK는 M. [M] -Primary Key를 의미한다. 그것이 반영 할 UID를 참조하는 것입니다. – DNorthrup