【发布时间】:2019-10-25 03:36:47
【问题描述】:
我正在尝试编写一个 SQL 查询,该查询根据连接表中某个列值的存在来过滤表。
我有一个表 pull_requests、一个连接表 pull_requests_releases 和一个表 releases。
pull_requests_releases 表在pull_requests.id = pull_requests_releases.pull_request_id 和pull_requests_releases.release_id = releases.id 上将pull_requests 连接到releases。相当简单。
我正在尝试收集其releases 子集在releases.app_id 列中不包含特定值的所有pull_requests。
这是我迄今为止尝试过的:
SELECT pull_requests.* from pull_requests
INNER JOIN pull_requests_releases ON pull_requests.id = pull_requests_releases.pull_request_id
INNER JOIN releases ON pull_requests_releases.release_id = releases.id
这将获取至少有一个链接release 的所有pull_requests。这一步很好。接下来是我不确定该怎么做的地方。我需要进一步过滤这些结果以仅包含 pull_requests 的特定值在其 releases 子集中不存在的 pull_requests。
我试过了:
SELECT pull_requests.* from pull_requests
INNER JOIN pull_requests_releases ON pull_requests.id = pull_requests_releases.pull_request_id
INNER JOIN releases ON pull_requests_releases.release_id = releases.id
WHERE [number] NOT IN (SELECT releases.app_id)
但是这一切都是先用那个app_id去掉releases,然后仍然用另一个releases返回pull_requests。
我也试过having这样:
SELECT pull_requests.* from pull_requests
INNER JOIN pull_requests_releases ON pull_requests.id = pull_requests_releases.pull_request_id
INNER JOIN releases ON pull_requests_releases.release_id = releases.id
GROUP BY pull_requests.id, pull_requests_releases.id, releases_id, releases.app_id
HAVING [number] NOT IN (SELECT releases.app_id)
我看到了同样的结果。
我需要在 end 本身进行过滤 - 不理会releases,并在其releases 包含该值的末尾过滤pull_requests。几乎就像在查询结束时对结果进行过滤一样。这可能吗?
我正在使用链接到两个releases 的pull_request 进行测试,一个与app_id 1 和一个与app_id 2 相关联。我尝试将[number] 设为2,并希望查询检查@987654351 @ 的releases,看到存在release 和app_id 为2,因此不返回pull_request。但是,正在发生的事情是 pull_request 仍在返回,只有一个链接的 release 而不是两个。
对不起,如果我的解释很糟糕。谢谢。
【问题讨论】:
-
我想你只需要说像 WHERE release.app_id 1234 这样应该过滤行
标签: sql postgresql