У меня есть таблица как таковая (tbl
):
+----+------+-----+
| pk | attr | val |
+----+------+-----+
| 0 | ohif | 4 |
| 1 | foha | 56 |
| 2 | slns | 2 |
| 3 | faso | 11 |
+----+------+-----+
И еще одна таблица в соотношении n-к-1 с tbl
(tbl2
):
+----+-----+
| pk | rel |
+----+-----+
| 0 | 0 |
| 1 | 1 |
| 2 | 0 |
| 3 | 2 |
| 4 | 2 |
| 5 | 3 |
| 6 | 1 |
| 7 | 2 |
+----+-----+
(tbl2.rel
-> tbl.pk
.)
Я хотел бы выбрать только строки из tbl
, которые связаны как минимум с n
строками из tbl2
.
Т.е. для 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 приемлемо.