2013-03-12 5 views
1

의가 (필자는 IsNewCustomer 플래그와 함께 주어진 일에 대한 응용 프로그램의 목록을 검색하고 싶은SQL - 가입 같은 테이블

ApplicationId INT, 
CustomerId INT, 
ApplicationDate DATETIME, 
IsNewCustomer BOOL 

을 다음과 같이 나는 테이블을 응용 프로그램 있다고 가정 해 봅시다있는 주어진 CustomerID에 대해 응용 프로그램이없는 경우 설정됩니다.

현재 동일한 테이블에서 다음과 같은 조인을 사용하고 있습니다.

select 
    o.ApplicationId as ApplicationId, 
    cast(o.ApplicationDate as date) as ApplicationDate, 
    case when n.ApplicationID is not null then 1 else 0 end as IsNewCustomer, 
    row_number() over (partition by o.ApplicationId order by o.ApplicationDate desc) as AppSeqNum 
from 
    Applications o 
    left join Applications n 
     on n.CustomerId = o.CustomerId 
     and n.ApplicationDate < o.ApplicationDate 
where 
    AppSeqNum = 1 
    and ApplicationDate = getdate() 

가장 우아한 솔루션과 같은 느낌이 들지 않는 동일한 테이블에 가입하지 않아도 동일한 결과를 얻을 수있는 더 좋은 방법이 있는지 궁금합니다.

감사합니다.

+0

동일한 테이블을 조인하는 대신 subselect를 수행 할 수 있지만 비용이 더 많이들 것입니다. 왜 그것이 옳다고 생각하지 않는지 이해하지 못합니다. 쿼리해야하는 정보가 들어있는 테이블은 응용 프로그램 테이블이므로 쿼리에 대한 문제는 무엇입니까? 또 다른 옵션은 IsNewCustomer를이 테이블의 삽입/업데이트 프로세스의 일부로 업데이트하여 필요할 때 데이터를 준비 할 수 있도록하는 것입니다. – tucaz

+0

아니,이 일을 제대로하고 있습니다. 이것은 자기 조인을 사용할 수있는 적절한 장소입니다. 자기 조인이 당신을 자의식이되게하지 마라! – criticalfix

+0

쿼리를 리버스 엔지니어링하거나 샘플 데이터와 원하는 결과를 보지 않고도 알기는 어렵지만 SQL Server 2012에서는 새 창 기능을 사용하여보다 효율적으로이 작업을 수행 할 수 있습니다. 이전 버전에서는 아마도 이것이 최선의 방법 일 것입니다. 테이블의 행은 몇 개입니까? 고객 당 평균 행 수는 얼마입니까? –

답변

0

글쎄, 하위 쿼리를 사용할 수도 있지만 자체 조인을 위장 할뿐입니다. 본질적으로 자체 조인에는 문제가 없습니다. 올바른 인덱스와 제약 조건이 없으면 테이블 크기가 제한되어있어 손에서 벗어날 수 있습니다. 자기 조인이 좋지 않다고 들었을 수도있는 이유 중 하나는 그렇지 않은 연속적인 단조 로움에서 휴식을 찾는 문제입니다. 1,000 개의 값이 있고 5 개가 누락되었다고 가정하고 value = value +1에 자체 조인 (인덱스 또는 제약 조건없이)을 수행하면 쿼리 최적화 프로그램은 5를 찾으려고하기 전에 1000 * 1000 개의 가능한 행이 있는지를 잘 판단 할 수 있습니다 null과 일치합니다. 따라서 합리적으로 제한된 리셋을 설정 한 경우 아무런 문제가 없습니다.