【发布时间】: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