문제

이것은 일종의 SQL 초보자 질문이지만 여기에 간다.

예제 사용자 정의 기능을 기반으로 한 SQL 쿼리 (SQL Server 2005)가 있습니다.

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

UDF는 훌륭하게 작동하지만 (관련 테이블의 여러 행에서 데이터를 연결합니다.) From Clause 이후의 "I"에 대해 혼란스러워합니다. 쿼리는 I와 잘 작동하지만 IT 없이는 실패합니다. "I"의 중요성은 무엇입니까?

편집 : Joel 아래에서 언급했듯이 키워드가 아닙니다.

도움이 되었습니까?

해결책

From Clause에서 하위 쿼리를 사용하면 쿼리 이름을 제공해야합니다. 이름은 실제로 당신에게 중요하지 않기 때문에 'i'또는 'a'와 같은 단순한 것이 종종 선택됩니다. 그러나 당신은 당신이 원했던 이름을 붙일 수 있습니다. 'I'자체에 대한 의미는 없으며, 확실히 키워드가 아닙니다.

정말 복잡한 쿼리가있는 경우 다른 쿼리 또는 테이블과 하위 쿼리에 가입해야 할 수도 있습니다. 이 경우 이름이 더 중요해지며 더 의미있는 것을 선택해야합니다.

다른 팁

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

"I"는 Select 문에 유효 테이블 이름을 제공합니다. 또한 (나는 MSSQLSERVER가 아니라고 생각합니다) "I as I"로 작성될 수 있습니다.

다른 사람들이 말했듯이, 그것은 하위 퀘스트의 테이블 이름 별명입니다.

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

이 예에서는 그다지 유용하지 않지만 여러 하위 쿼리가 있으면 매우 중요한 명확한 도구입니다.

하지만 더 나은 변수 이름을 선택합니다. "온도"조차도 더 좋습니다.

I는 수많은 하위 쿼리가있는 복잡한 쿼리가 있고 필드에 액세스 해야하는 경우 명백한 방식으로 그렇게 할 수 있도록 하위 쿼리의 이름을 지정합니다.

더 긴 쿼리를 작성하기 시작할 때 자신의 혼란을 막기 위해 하위 쿼리를보다 설명적인 이름을 부여하는 것이 좋습니다. 오른쪽 또는 테이블/쿼리 C.Name이 검색되고 있습니다.

배운 교훈은 코드를 상속받을 사람을 생각하는 것입니다. 다른 사람들이 말했듯이, 코드가 다음과 같이 작성된 경우 :

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

그런 다음 독자가 그것을 알아 냈을 가능성이 높아지고 '파생 된 테이블'을 암시하는 'DT1'을 픽업 할 수도 있습니다.

"파생 테이블"은 From Clause에서 하위 쿼리를 사용하는 기술 용어입니다.

SQL Server Books Online Syntax는이 경우 table_alias가 선택 사항이 아님을 보여줍니다. "table_alias"는 괄호로 둘러싸여 있지 않으며 Transact-SQL 구문 규칙에 따라 괄호 안의 사물은 선택 사항입니다. 키워드 "AS"는 괄호로 둘러싸여 있기 때문에 선택 사항입니다 ...

   devived_table [as] table_alias [(column_alias [, ... n])

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

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top