2016-10-13 2 views
0

아래의 간단한 쿼리를 사용하여 체크 아웃 및 예상 반환 날짜를 기반으로 테이블에서 사용 가능한 자산을 선택합니다. 체크 아웃 및 예상 반환 날짜가 @RentStartDate@RentEndDate과 겹치면 UnavailableAsset으로 선택하고 싶습니다.더 나은 성능을 위해 간단한 SQL 조건을 다시 작성하는 방법

set @RentStartDate = '2016-10-13'; 
set @RentEndDate = '2016-10-18'; 

SELECT AssetID as UnAvailableAsset 
FROM agreementasset 
WHERE (CheckOutDate >= @RentStartDate AND CheckOutDate <= @RentEndDate) 
OR 
(ExpectedReturnDate >= @RentStartDate AND ExpectedReturnDate <= @RentEndDate) 
OR 
(@RentStartDate >= CheckOutDate AND @RentEndDate <= ExpectedReturnDate); 

지금 내가이 쿼리가 완벽하게 작동하는지 알고 아래로 내 쿼리를 볼 수 있지만, 난 그냥 where 절에 조건을 작성하는 더 나은 방법이 있는지 확실하지 않다하시기 바랍니다. 이 쿼리를보다 효율적으로 만들기위한 조건을 단순화하는 더 좋은 방법이 있습니까?

감사합니다.

+4

데이터베이스 엔진 ? 쿼리 계획을 확인하여 수행중인 작업을 확인 했습니까? –

+0

테이블 정의, 인덱스 포함? – jarlh

+1

더 나은 성능을 제공하지만 가독성을 높일 수는 없지만'CheckOutDate> = @RentStartDate AND CheckOutDate <= @RentEndDate '를'CheckOutDate BETWEEN @RentStartDate AND @ RentEndDate' 및'(ExpectedReturnDate> = @RentStartDate AND ExpectedReturnDate <= @RentEndDate)'와'ExpectedReturnDate BETWEEN @RentStartDate AND @ RentEndDate'를 비교합니다. – haindl

답변

0

당신이하고있는 일에 대한 설명을 근거로, 귀하의 질문에 대한 생각이 왜 이해가 안됩니다.

중첩 쿼리는 다음과 같이한다 : 쿼리의

SELECT AssetID as UnAvailableAsset 
FROM agreementasset 
WHERE CheckOutDate <= @RentEndDate AND 
     ExpectedReturnDate >= @RentStartDate; 

이 유형 (대부분의 데이터베이스에서) 최적화하기가 어려울 수 있습니다. agreementasset(CheckOutDate, ExpectedReturnDate, AssetID)의 색인으로 시작할 수 있습니다.

+0

전에이 쿼리를 사용해 보았습니다. 임대일의 범위에 체크 아웃 및 expectedReturndate가있는 자산 만 선택합니다. 내가 겹치기 란 의미는 체크 아웃이나 예정된 일정이 대여 날짜 범위에 해당한다고해도 그 자산을 사용할 수 없게됩니다. – Vibol

+0

색인 생성이 가장 좋은 방법입니다. – Vibol

+0

@Vibol. . . 쿼리를 자세히 읽으십시오. 이것은 기간의 모든 중복에 대한 논리입니다. –

0

BETWEEN 키워드를 사용해 보셨습니까?

SELECT AssetID as UnAvailableAsset 
FROM agreementasset 
WHERE (CheckOutDate BETWEEN @RentStartDate AND @RentEndDate) 
OR (ExpectedReturnDate BETWEEN @RentStartDate AND @RentEndDate) 
+0

마지막'OR (@RentStartDate> = CheckOutDate 및 @RentEndDate <= ExpectedReturnDate) '을 잊어 버렸습니다. 이 사례는 귀하의 술어로 다루지 않습니다. 적어도 의도 한 술어 논리에 대한 더 많은 통찰력을 갖고 있지 않다면 말이다. – haindl

0

난 당신이 간소화 수 있다고 생각하지 않습니다없고 중복 조건

SELECT AssetID as UnAvailableAsset 
FROM agreementasset 
WHERE (@RentStartDate <= CheckOutDate  AND @RentEndDate >= CheckOutDate) 
    OR (@RentStartDate >= CheckOutDate  AND @RentEndDate <= ExpectedReturnDate) 
    OR (@RentStartDate <= ExpectedReturnDate AND @RentEndDate >= ExpectedReturnDate); 
관련 문제