我已经使用了最后几个小时试图构建这个我无法解决的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的条件。 但这并没有返回预期的结果,事实上很长一段时间。
如果有人可以帮助我,我会很感激,并解释一下。
如果您有疑问,请告诉我。
答案 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 ...
,即DISTINCT
和GROUP BY
通常无效。