【问题标题】:Find rows in relation with at least n rows in a different table without joins在没有连接的情况下查找与不同表中至少 n 行相关的行
【发布时间】:2019-06-05 17:07:23
【问题描述】:

我有一张这样的桌子 (tbl):

+----+------+-----+
| pk | attr | val |
+----+------+-----+
|  0 | ohif |   4 |
|  1 | foha |  56 |
|  2 | slns |   2 |
|  3 | faso |  11 |
+----+------+-----+

还有另一个与tbl (tbl2) 成n 对1 关系的表:

+----+-----+
| pk | rel |
+----+-----+
|  0 |   0 |
|  1 |   1 |
|  2 |   0 |
|  3 |   2 |
|  4 |   2 |
|  5 |   3 |
|  6 |   1 |
|  7 |   2 |
+----+-----+

(tbl2.rel -> tbl.pk.)

我只想从tbl 中选择至少与tbl2 中的n 行相关的行。

即,对于n = 2,我想要这个表:

+----+------+-----+
| pk | attr | val |
+----+------+-----+
|  0 | ohif |   4 |
|  1 | foha |  56 |
|  2 | slns |   2 |
+----+------+-----+

这是我想出的解决方案:

SELECT DISTINCT ON (tbl.pk) tbl.*
FROM (
    SELECT tbl.pk
    FROM tbl
    RIGHT OUTER JOIN tbl2 ON tbl2.rel = tbl.pk
    GROUP BY tbl.pk
    HAVING COUNT(tbl2.*) >= 2  -- n
) AS tbl_candidates
LEFT OUTER JOIN tbl ON tbl_candidates.pk = tbl.pk

是否可以在不使用子查询选择候选者并重新加入表的情况下完成?

我使用的是 Postgres 10。标准 SQL 解决方案会更好,但 Postgres 解决方案是可以接受的。

【问题讨论】:

  • @philipxy 具有讽刺意味的是,在要求我具体说明时,您却如此明显地笼统:问题以一般形式精确陈述,并伴随着一个完全有效的解决方案。不过,我显然错误地明确要求提供不涉及joins 的解决方案,这足以表明我在发布问题之前确实研究了该问题,并且这不是“请做对我的查询”常见问题解答,但一个优化问题。这也是您链接的问题不重复的原因。
  • 由于该问题已被标记为可能重复,因此我对其进行了编辑。我希望现在更清楚了。
  • 我对你的(原始)标题有偏见。但是您的结束问题有一堆重复项,无论如何该问题的答案就是该标题的答案-无论您研究了什么,仍然有很多容易找到的重复项。 PS 对于通过连接和通过子查询连接来编写子查询的其他方式,还有更多常见问题解答。
  • @philipxy 你在标题上有一点,我已经更正了。我仍然找不到我的问题的重复项。
  • 我提供的重复链接指向错误的帖子。现在谷歌搜索(比如说)'site:stackoverflow.com sql Find rows with at least n rows in another table' ...第一次点击:

标签: postgresql self-join


【解决方案1】:

好的,加入一次,如下:

select
    t1.pk,
    t1.attr,
    t1.val
from
    tbl t1
join
    tbl2 t2 on t1.pk = t2.rel
group by
    t1.pk,
    t1.attr,
    t1.val
having(count(1)>=2) order by t1.pk;
 pk | attr | val 
----+------+-----
  0 | ohif |   4
  1 | foha |  56
  2 | slns |   2
(3 rows)

或者只加入一次并使用CTE(with clause),如下:

with tmp as (
select rel from tbl2 group by rel having(count(1)>=2)
)
select b.* from tmp t join tbl b on t.rel = b.pk order by b.pk;
 pk | attr | val 
----+------+-----
  0 | ohif |   4
  1 | foha |  56
  2 | slns |   2
(3 rows)

SQL 是否更清晰?

【讨论】:

  • 你的 SQL 在功能上和我的不一样吗?唯一的区别是我没有明确使用临时表。
  • @RiccardoBestetti 重新编辑了答案,请检查。只需查看第一个 SQL。 :)
  • 好的,现在明白了!谢谢。
猜你喜欢
  • 2012-03-25
  • 2022-01-21
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多