2014-07-08 1 views
0

너무 많은 시간 동안이 머리글을 감쌀 수없는 SQL 쿼리를 구성하려고합니다.연결 제한이있는 테이블을 선택하는 쿼리 만들기

다음과 같은 관계로 3 개의 테이블이 있습니다. 나머지 열은 간단하게 제거했습니다.

- Jobs 
id 

- Company 
id 

- Offer 
job_id 
company_id 
offer_type (either 'single' or 'voucher') 

- Reservation 
job_id 
company_id 

컨텍스트.

사용자가 작업을 만듭니다. 회사는 직업에 대해 하나 또는 두 개의 오퍼 (각 유형 중 하나)를 만들 수 있으며, 직업은 3 개의 다른 회사에서 오퍼를 얻으면 종료됩니다. 또한 예약은 관광 명소 중 하나를 차지할 수 있습니다.

그래서 회사에 대한 모든 공개 작업을 가져 오려고합니다. 그것은 2 개의 다른 회사에게서 제안을받은 모든 일이다.

언급했듯이 내가 지금까지 가지고있는 쿼리를 생각해 냈습니다.

;WITH company_offers AS 
(
    SELECT 
    DISTINCT ON(offers.company_id) offers.company_id, 
    count(offers.company_id) as total, 
    offers.job_id 
    FROM offers 
    GROUP BY offers.company_id, offers.job_id 
), 
counts AS 
(
    SELECT jobs.*, 
    (SELECT count(*) FROM company_offers) as offer_count, 
    (SELECT count(*) FROM reservations WHERE reservations.job_id = jobs.id) as reservation_count 
    FROM jobs 
    JOIN company_offers ON company_offers.job_id = jobs.id 
    GROUP BY jobs.id 
) 

SELECT offer_count+reservation_count as total 
FROM counts 

첫 번째 CTE에서 고유 한 회사 ID로 쿠폰을 가져 오려고했습니다. 그런 다음 두 번째 CTE를 사용하여 첫 번째 결과를 계산하고 예약을 찾습니다. 그런 다음 마침내 함께 추가하고 마지막으로 합계가 3보다 작은 조건을 만들어야합니다. 그러나 예상 된 결과가 실제로는 오랫동안 반환되지 않습니다.

나는 누군가가 나를 도울 수 있고, 또한 설명 할 수 있으면 감사 할 것이다.

질문이 있으면 알려주세요.

답변

1

일부 범용의 SQL은 다음과 같이 수 :

select Jobs.id 
from Jobs 
left outer join Offer on Offer.job_id = Jobs.id 
left outer join Reservation on Reservation.job_id = Jobs.id 
group by Jobs.id 
having count(distinct Offer.company_id) + count(distinct Reservation.company_id) < 3 

을 PostgreSQL의 그 count(distinct ...)을 좋아하지 않는 경우, 이에 상응하는 하위 쿼리를 포함 할 수 있습니다.

그런데 : SELECT DISTINCT ... GROUP BY ..., 즉 DISTINCTGROUP BY은 일반적으로 해결되지 않습니다.

+0

가상 포옹을 보내드립니다! 정말 고맙습니다! – MartinElvar

+0

다행히 도울 수 있어요 :) – JimmyB