2017-05-10 3 views
1

ALL 하위 쿼리와 관련된 WHERE 절 조건이 있습니다. 하위 쿼리 결과가 비어있는 경우가 있는데이 경우 표현식은 항상 true으로 계산되지만이 값을 false으로 지정해야합니다.postgresql ALL 하위 쿼리가 비어 있음을 평가합니다.

예를 들어, 드라이버 테이블, 경로 테이블 및 각 드라이버가 구동 한 경로를 보여주는 다 대다 상호 작용 테이블이 있다고 가정합니다. 저는 50 마일 이상을 주행하는 운전자 만 찾고 싶습니다.

SELECT * FROM driver 
WHERE 50 < ALL(
    SELECT miles FROM route, driver_route 
    WHERE driver_route.route_id = route.id AND 
      driver_route.driver_id = driver.id) 

이 쿼리에는 원하는 결과가 아닌 결과의 경로를 주도한 드라이버가 포함됩니다.

나는 coalesce를 사용해 보았지만 ERROR: more than one row returned by a subquery used as an expression에 달했다. 내가 충분히 일반적으로 서로 다른 유형의 쿼리에 적용 할 수의 구조를 찾고 있어요

SELECT * FROM driver 
WHERE 50 < COALESCE((
    SELECT ALL(SELECT miles FROM route, driver_route 
    WHERE driver_route.route_id = route.id AND 
      driver_route.driver_id = driver.id)), 
    0); 

: 저는 여기에 해당 쿼리를 표현한 방법입니다.

답변

1

어떤 약이

SELECT * FROM driver 
WHERE NOT EXISTS ( 
    SELECT miles FROM route, driver_route 
    WHERE driver_route.route_id = route.id AND 
      driver_route.driver_id = driver.id AND 
      miles <= 50 
       ) 
AND EXISTS ( 
    SELECT miles FROM route, driver_route 
    WHERE driver_route.route_id = route.id AND 
      driver_route.driver_id = driver.id AND 
      miles > 50 
       ) 

모든 50보다 큰 것은 당신이 필요하다고 생각 (50)

+0

감사합니다 . 결과는 같습니다. 내가 올바르게 존재한다는 것을 이해한다면,이 쿼리는 명시 적으로 빈 결과를 포함하는데, 이는 피하려고하는 것입니다. – user3747260

+0

@ user3747260은'AND EXISTS'에 맞춰 적어도 하나의'miles> 50 '을 요구합니다. – flutter

+0

물론입니다. 중복에도 불구하고 쿼리 플래너가이를 잘 처리하는 것으로 보입니다. 나는 이것이 일반적인 문제가 아니며 더 표준적인 해결책이 없다는 사실에 놀랐다.하지만 당신은 잘 작동하는 것 같다. 감사. – user3747260

2

보다 작거나 동일하다면 없음에 해당합니다 : 귀하의 회신

select driver.* from driver inner join (
    select driver.id from driver 
    inner join driver_route 
    on driver.id = driver_route.driver_id 
    inner join route 
    on route.id = driver_route.route_id 
    group by driver.id 
    having min(route.miles) > 50 
)t 
on driver.id = t.id 
+0

이것은 흥미로운 접근 방식이며 작동합니다. 불행히도 나는 다른 유형에 적용 할 수있는 동일한 구조를 가진 일반적인 솔루션을 찾고 있으며 min을 사용하면 상당히 복잡한 작업을 수행 할 수 있습니다. – user3747260