构造查询,用于选择具有关联限制的表

时间:2014-07-08 15:37:29

标签: sql postgresql common-table-expression

我已经使用了最后几个小时试图构建这个我无法解决的SQL查询。

我有三个表,有以下关系,为了简单起见,我删除了其余的列。

- 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 个答案:

答案 0 :(得分: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通常无效。