2008-10-01 2 views
3

이것은 일종의 SQL 초보자 용 질문입니다.하지만 여기에 있습니다.SQL 문에 익숙하지 않은 문자

은 내가 예를 들어 사용자 정의 함수에 함께 넣어 기반으로 한는 SQL 쿼리 (SQL 서버 2005)이 있습니다

SELECT 
    CASEID, 
    GetNoteText(CASEID) 
FROM 
( 
    SELECT 
     CASEID 
    FROM 
     ATTACHMENTS 
    GROUP BY 
     CASEID 
) i 
GO 

는 UDF가 좋은 작품을 (그것은 관련에 여러 행의 데이터를 연결합니다 테이블, 그게 전혀 문제가 있다면) 나는 FROM 절 뒤에 "i"에 대해 혼란 스럽다. 쿼리는 i와 잘 작동하지만 실패하면 실패합니다. "i"의 의미는 무엇입니까?

편집이 : 조엘은 아래에 언급 한 바와 같이 당신이 FROM 절에 하위 쿼리를 사용하면 키워드

답변

16

하지, 당신은 쿼리에 이름을 지정해야합니다. 이름이 당신에게 정말로 중요하지 않기 때문에 'i'나 'a'와 같은 단순한 것이 종종 선택됩니다. 그러나 당신은 당신이 원했던 어떤 이름이라도 넣을 수 있습니다 - 나는 그 자체만으로는 의미가 없으며 확실히 키워드가 아닙니다.

정말 복잡한 쿼리가있는 경우 하위 쿼리를 다른 쿼리 나 테이블과 조인해야 할 수 있습니다. 이 경우 이름이 더 중요 해지고 더 의미있는 것을 선택해야합니다.

+0

아, 이렇게하면 subselect를 임시 테이블처럼 취급해야합니다. 아마도 당신의 대답에 그 사실을 알 수있을 것입니다.) – cori

+0

네, 네이밍 관점에서 그렇습니다. 쿼리 최적화 관점에서 아니요. 별명은 옵티마이 저가 u 리를 해석하는 f 식에 영향을주지 않습니다. –

+1

MS-SQL 영역에서 FROM 또는 JOIN 절의 하위 쿼리를 파생 테이블로 참조합니다. 일반적으로 하위 쿼리를 참조 할 때 스칼라 또는 상관 된 하위 쿼리입니다. –

3

"i"는 select 문에 유효한 테이블 이름을 제공합니다. 또한 "AS i"로 쓰여질 수도 있습니다 (저는 MSSQLServer 사람이 아닙니다).

1

다른 언급이 있듯이 하위 쿼리의 테이블 이름 별칭입니다.

하위 쿼리 외부에서 i.CASEID를 사용하여 하위 쿼리 결과를 참조 할 수 있습니다.

이 예에서는 너무 유용하지 않지만 하위 쿼리가 여러 개인 경우 매우 모호하지 않은 도구입니다.

비록 더 나은 변수 이름을 선택 하겠지만. 심지어 "temp"가 더 좋습니다.

6

i는 (부속 쿼리)를 필요로하며 추가 조인에 필요합니다.

당신은 같은 조인 된 테이블 사이에 열 이름 충돌이있는 경우 하위 쿼리 이름으로 외부 쿼리에 열을 접두사해야합니다 :

SELECT 
    c.CASEID, c.CASE_NAME, 
    a.COUNT AS ATTACHMENTSCOUNT, o.COUNT as OTHERCOUNT, 
    dbo.GetNoteText(c.CASEID) 
FROM CASES c 
LEFT OUTER JOIN 
( 
    SELECT 
     CASEID, COUNT(*) AS COUNT 
    FROM 
     ATTACHMENTS 
    GROUP BY 
     CASEID 
) a 
ON a.CASEID = c.CASEID 
LEFT OUTER JOIN 
(
    SELECT 
     CASEID, COUNT(*) AS COUNT 
    FROM 
     OTHER 
    GROUP BY 
     CASEID 
) o 
ON o.CASEID = c.CASEID 
1

의 I 이름 귀하의 하위 쿼리 그래서 당신은 복잡한 쿼리가있는 경우 수많은 하위 쿼리가 있으므로 명확한 방법으로 필드에 액세스해야합니다.

긴 쿼리를 작성하기 시작할 때 자신의 혼란을 피하기 위해 하위 쿼리를 더 잘 설명하는 이름을 지정하는 것이 좋습니다. 긴 SQL 쿼리를 통해 위로 스크롤해야 할 필요가 없습니다. .id가 올바른 테이블인지 또는 어떤 테이블/쿼리 c.name이 검색되고 있는지.

0

"파생 테이블"은 FROM 절에서 하위 쿼리를 사용하기위한 전문 용어입니다.

SQL Server 온라인 설명서 구문은이 경우 table_alias가 선택 사항이 아니라는 것을 보여줍니다. "table_alias"는 대괄호로 묶지 않으며 Transact-SQL 구문 표기 규칙에 따라 대괄호 안의 항목은 선택 사항입니다. 키워드 "AS"는 대괄호 안에 있기 때문에 선택 사항입니다 ...

      derived_table [AS] table_alias [(column_alias [... N])] (거래-SQL) FROM

:
http://msdn.microsoft.com/en-us/library/ms177634(SQL.90).aspx

거래-SQL 구문 규칙 :
http://msdn.microsoft.com/en-us/library/ms177563(SQL.90).aspx

0

배워야 할 교훈은 코드를 상속받을 사람을 생각하는 것입니다. 다른 사람이 말했듯이, 코드는 다음과 같이 기록 된 경우 :

SELECT DT1.CASEID, GetNoteText(DT1.CASEID) 
FROM (
    SELECT CASEID 
    FROM ATTACHMENTS 
    GROUP BY CASEID 
) AS DT1 (CASEID); 

는 독자가 그것을 알아 낸 것, 심지어 '파생 테이블'암시 'DT1'에서 선택할 수 증가 가능성이있다.

관련 문제