【问题标题】:SQL Query Not Filtering Results as Expected - Excluding Results with Certain Column ValueSQL 查询未按预期过滤结果 - 排除具有特定列值的结果
【发布时间】:2019-10-25 03:36:47
【问题描述】:

我正在尝试编写一个 SQL 查询,该查询根据连接表中某个列值的存在来过滤表。

我有一个表 pull_requests、一个连接表 pull_requests_releases 和一个表 releases

pull_requests_releases 表在pull_requests.id = pull_requests_releases.pull_request_idpull_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。几乎就像在查询结束时对结果进行过滤一样。这可能吗?

我正在使用链接到两个releasespull_request 进行测试,一个与app_id 1 和一个与app_id 2 相关联。我尝试将[number] 设为2,并希望查询检查@987654351 @ 的releases,看到存在releaseapp_id 为2,因此不返回pull_request。但是,正在发生的事情是 pull_request 仍在返回,只有一个链接的 release 而不是两个。

对不起,如果我的解释很糟糕。谢谢。

【问题讨论】:

  • 我想你只需要说像 WHERE release.app_id 1234 这样应该过滤行

标签: sql postgresql


【解决方案1】:
SELECT * 
FROM pull_requests p -- you only want to select from pull_requests
WHERE NOT EXISTS (   -- except when some release exists
        SELECT *
        FROM releases r 
        JOIN pull_requests_releases pr ON pr.release_id = r.id
        WHERE p.id = pr.pull_request_id
        AND r.app_id NOT in (12345,6789)
        )
        ;

您的问题中已经隐藏了查询:

我正在尝试收集所有 pull_requests,它们的发布子集在 release.app_id 列中不包含特定值。

【讨论】:

    【解决方案2】:

    我认为您的NOT IN 格式可能不正确:

    pull_requests_releases 表将pull_requests 加入到发布日期 pull_requests.id = pull_requests_releases.pull_request_idpull_requests_releases.release_id = releases.id。相当 直截了当。

    我正在尝试收集他们发布的所有pull_requests 子集在releases.app_id 列中不包含某个值。

    SELECT pr.*
    FROM pull_requests pr
    JOIN pull_requests_releases prr
      ON pr.id = prr.pull_request_id
    JOIN releases r
      ON prr.release_id = r.id
    WHERE r.app_id NOT IN (<list_of_values>);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多