2016-08-09 2 views
0

작업중인 프로젝트에 대한 SQL 문을 작성하려고합니다. 렌트 테이블에 그 날짜에 예약되지 않은 올바른 크기의 차량 인 vehicleId을 모두 반환해야합니다.겹치지 않는지 확인하십시오.

스키마

Vehicles(vehicleId, size) 
Rental(rentId, customerId, vehicleId, startdate, enddate, cost) 

SELECT vehicles.vehicleId 
FROM vehicles 
WHERE vehicles.size= "van" 
AND vehicles.vehicleId <> 
(SELECT rental.vehicleId 
FROM rental 
WHERE (rental.startdate BETWEEN '2016-04-27' AND '2016-04-30') 
OR (rental.enddate BETWEEN '2016-04-27' AND '2016-04-30')) 
전과

명령문의 첫 번째 부분, AND (관련 2 개의 테이블)의 후 사이즈 밴과 두 번째 부분에 모든 vehicleid를 반환하고, 하나를 제거해야합니다 시작일 또는 종료일이 겹침 여부를 확인하여 시간 프레임에서 예정된 차량 ID입니다. 그러나 두 번째 부분은 그처럼 작동하지 않으며 실행하면 모든 것이 반환되지 않습니다.

진술에 어떤 문제가 있습니까?

답변

1

귀하의 문제는 원래 쿼리의 시세 및의 사용을 수 있습니다 NOT IN 대신. 그러나 더 중요한 것은 중복에 대한 논리가 잘못되었음을 의미합니다. 나는 당신이 원하는 생각 :

SELECT v.vehicleId 
FROM vehicles v 
WHERE v.size = 'van' AND 
     v.vehicleId NOT IN (SELECT r.vehicleId 
          FROM rental r 
          WHERE r.startdate <= '2016-04-30' AND 
           r.enddate >= '2016-04-27' 
         ); 

사소한 예를 들어, '2016년 5월 1일'에서 '2016년 4월 1일'에서 대여 당신의 논리에 의해 제대로 태그가되지 않을 것이다.

기간을 중첩하는 올바른 논리는 다른 기간이 끝나기 전에 한 기간이 시작되고 다른 기간이 끝난 후 첫 번째 기간이 종료된다는 것입니다.

1

당신은 당신의 날짜를 인용하지 않았다, 그래서 그들은 날짜 아니에요 - 그들은 수학 식입니다 : 그것은 "2016 마이너스 4 마이너스 27"인 것처럼

rental.enddate BETWEEN 2016-04-27 AND 2016-04-30 

실행을 :

rental.enddate BETWEEN 1985 AND 1982 

는 그들은 모두 인용한다 :

rental.enddate BETWEEN '2016-04-27' AND '2016-04-30' 
+0

에 따옴표를 추가했으나 여전히 문을 반환하지 않습니다. (변경을 반영하기 위해 위에서 편집 됨) –

+0

하위 쿼리가 여러 행의 데이터를 반환 할 수 있다면'<>'대신'not in '을 원할 수도 있습니다. –

+0

내가 필요로하는 것이 었습니다. 고마워. 나는 내가 인정하는 것보다 오랫동안 이것에 붙어 있었다. –

관련 문제