By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
Help with an interesting Postgres question: Why isn't an Index Only Scan used on a partition accessed via the parent table?.
select version();
version |
---|
PostgreSQL 11.3 (Debian 11.3-1.pgdg90+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, 64-bit |
create table crosses (a varchar, b varchar);
insert into crosses values ('1','A');
insert into crosses values ('1','B');
insert into crosses values ('2','A');
insert into crosses values ('2','C');
insert into crosses values ('3','C');
insert into crosses values ('3','D');
insert into crosses values ('4','E');
1 rows affected
1 rows affected
1 rows affected
1 rows affected
1 rows affected
1 rows affected
1 rows affected
WITH RECURSIVE cte AS
(
SELECT
a,
b,
FALSE revertRef
FROM
crosses
WHERE
a = '1'
UNION
SELECT
c.a,
c.b,
(NOT cte.revertRef) revertRef
FROM
cte
INNER JOIN crosses c ON
(CASE WHEN cte.revertRef THEN c.a ELSE c.b END) = (CASE WHEN cte.revertRef THEN cte.a ELSE cte.b END)
)
SELECT * FROM cte WHERE revertRef ORDER BY a;
a | b | revertref |
---|---|---|
1 | A | t |
1 | B | t |
2 | A | t |
2 | C | t |
3 | C | t |
3 | D | t |
SELECT a, b
FROM
(
SELECT *
, COUNT(*) OVER(PARTITION BY a) AS a_cnt
, COUNT(*) OVER(PARTITION BY b) AS b_cnt
FROM crosses
) temp
WHERE a_cnt > 1 OR b_cnt > 1
-- ORDER BY a, b
;
a | b |
---|---|
1 | A |
2 | A |
1 | B |
2 | C |
3 | C |
3 | D |