2012-05-03 3 views
5

테이블 이름 중 하나에 별칭을 지정하지 않으면 내 쿼리가 작동하지 않는 여러 JOIN으로 쿼리를 수행 할 때 나타났습니다.SQL에서 테이블 이름에 별명을 지정해야하는시기는 언제입니까?

다음은 간단한 예는 점을 설명 할 수있다 :

을이 은하지 않습니다 일 :

SELECT subject 
from items 
join purchases on items.folder_id=purchases.item_id 
join purchases on items.date=purchases.purchase_date 
group by folder_id 

을 수행합니다

SELECT subject 
from items 
join purchases on items.folder_id=purchases.item_id 
join purchases as p on items.date=p.purchase_date 
group by folder_id 

누군가가이

설명 할 수 있습니까?

답변

5

동일한 테이블을 사용 중입니다. 쿼리에서 두 번 구입합니다. 다른 이름을 지정하여 차별화해야합니다.

당신은 별칭을 제공해야합니다

  • When the same table name is referenced multiple times

가 동일한 신원 미상을 가진 두 사람이 상상해보십시오. 존에게 전화하면 두 사람 모두 당신의 전화에 응답 할 것입니다. 두 사람에게 같은 이름을 지어 줄 수는 없으며 그들이 당신이 누구인지를 알 것이라고 가정합니다. 마찬가지로 똑같은 이름의 동일한 결과 집합을 제공하면 SQL은 어느 결과 집합에서 값을 가져올 지 식별 할 수 없습니다. SQL 엔진이 혼동되지 않도록 결과 세트를 구별하기 위해 다른 이름을 제공해야합니다.

스크립트 1 : 사람이 이름이없는 경우 T1T2 당신은 여기

SELECT  t1.col2 
FROM  table1 t1 
INNER JOIN table1 t2 
ON   t1.col1 = t2.col1 
  • When there is a derived table/sub query output

별명입니다 그들에게 전화하고 그 사람에게 전화 할 수 없기 때문에, 그들은 응답하지 않을 것이다. 유. 마찬가지로 파생 테이블 출력 또는 하위 쿼리 출력을 생성 할 때 SQL 엔진에 알려지지 않은 것이므로 호출 할 대상이 아닙니다. 따라서 SQL 엔진이 파생 된 출력을 적절하게 처리 할 수 ​​있도록 파생 된 출력에 이름을 지정해야합니다.

스크립트 2 : t1은 여기에 별칭입니다.

SELECT col1 
FROM 
(
    SELECT col1 
    FROM table1 
) t1 
4

별칭을 제공해야하는 유일한 경우는 테이블을 여러 번 참조 할 때와 파생 출력 (테이블로 작동하는 하위 쿼리)이있는 경우입니다 (Siva를 가져와 주셔서 감사합니다). 이렇게하면 테이블 참조가 나머지 쿼리에서 사용할 모호성을 제거 할 수 있습니다.

당신의 예에서, 더 정교하게하려면 :

SELECT subject 
from items 
join purchases on items.folder_id=purchases.item_id 
join purchases on items.date=purchases.purchase_date 
group by folder_id 

내 가정은 당신이 느끼는 것입니다 각 join하고, 그러나 당신은 당신이 원하는 어느 표 참조 사용할 수있는 상관 테이블을 사용합니다 on 해당. 그래서, 당신이 on items.date=purchases.purchase_date라고 말할 때 SQL 엔진은 첫 번째 구매 테이블을 의미하는지 두 번째 구매 테이블을 의미하는지 혼동합니다.

별칭을 추가하면 더 명확하게 모호성을 없앨 수 있습니다. SQL 엔진은 이제 사용하려는 구매 버전을 100 % 확실하게 말할 수 있습니다. 두 개의 동등한 선택 중 하나를 추측해야한다면, 더 명확하게 요구하는 오류가 항상 발생합니다.

+0

@Siva가 수정되었습니다. 감사합니다. –

1

동일한 테이블이 쿼리에서 두 번 사용되면 이름을 지정해야합니다. 귀하의 경우 쿼리는 어떤 테이블에서 purchases.purchase_date를 선택할 지 알 수 없습니다.

0

모호한 조인 조건을 방지하기 위해 다른 쿼리로 별칭이 지정되지 않은 한 같은 쿼리에서 동일한 테이블 이름을 사용할 수 없습니다. 그것이 허용되지 않는 이유입니다. 필자는 table.field 또는 alias.field를 항상 정규화하여 사용하는 것이 좋습니다. 따라서 다른 개발자가 어떤 테이블에서 어떤 열을 가져 오는지 추측 할 필요가 없습니다.

쿼리를 작성할 때, 당신은 당신이하고있는 일을 알고 있지만, 개발중인 사람은 어떨까요? 어떤 테이블에서 어떤 컬럼이 왔는지에 익숙하지 않은 사용자는 S/O에서 특히 여기를 따르기가 모호 할 수 있습니다. 항상 테이블 참조 및 필드 또는 별칭 참조 및 필드를 사용하여 정규화함으로써 훨씬 쉽게 따라 할 수 있습니다.

select 
     SomeField, 
     AnotherField 
    from 
     OneOfMyTables 
     Join SecondTable 
      on SomeID = SecondID 

은 ... 공지 사항을 읽어 선호하는 이러한 두 가지 시나리오에서

select 
     T1.SomeField, 
     T2.AnotherField 
    from 
     OneOfMyTables T1 
     JOIN SecondTable T2 
      on T1.SomeID = T2.SecondID 

에, 나는 짧은 별칭 "T1"및 "T2"를 사용하여 쿼리를 단순화 한 것을 비교하지만, 그것들은 무엇이든 될 수 있습니다. 테이블 이름의 두문자어 또는 축약 된 별칭 ... "oomt"(내 테이블 중 하나)와 "st"(두 번째 테이블) 일 수 있습니다. 아니면, 다른 게시물에 있었던 것처럼 오래 슈퍼 무언가로 ...

Select * from ContractPurchaseOffice_AgencyLookupTable 

vs 

Select * from ContractPurchaseOffice_AgencyLookupTable AgencyLkup 

조인 또는 필드 열을 계속 유지해야하는 경우보고 싶은 것이 좋습니다.

희망 사항은 질문을 명확히하기를 바랍니다.

+0

안녕하세요. DRapp, 감사합니다. 나는 귀하의 문장에 대해 다소 혼란스러워합니다. "항상 자격있는 table.field ...를 사용하는 것이 좋습니다." 그걸 확장 할 수 있습니까? –

1

이 경우 단순히 구매를 두 번 지정 했으므로 SQL 엔진이 고유 한 방식으로 조인의 각 데이터 세트를 참조 할 수 있어야하므로 별칭이 필요합니다.

측면으로 볼 때 실제로 구매를 두 번해야합니까? 작동하지 않겠습니까?

SELECT 
    subject 
from 
    items 
    join purchases 
     on items.folder_id=purchases.item_id 
     and items.date=purchases.purchase_date 
group by folder_id 
+0

덕분에 데이브, 오, 그 멋진 해결책은 생각하지 못했습니다! –

1

별칭은 열을 가져올 테이블의 명확성을 위해 필요합니다.

따라서 열 이름이 보낸 사람 목록의 테이블에서 사용 가능한 모든 열 목록에서 고유 한 경우 coulmn 이름을 직접 사용할 수 있습니다.

from 목록에서 사용 가능한 여러 테이블에서 열의 이름이 반복되는 경우 DB 서버는 열을 가져올 올바른 테이블을 추측 할 방법이 없습니다.

예제 쿼리에서 동일한 테이블 (구매)의 "두 인스턴스"를 얻으므로 모든 열 이름이 복제되므로 서버는 인스턴스를 기반으로 열을 가져와야합니다. 그러 G로 지정해야합니다.

실제로 단일 테이블이 아닌 한 항상 별칭을 사용하는 것이 좋습니다. 이렇게하면 많은 문제를 피할 수 있고 쿼리를 훨씬 명확하게 이해할 수 있습니다.

관련 문제