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?.
CREATE TABLE pipes (id int, geom geometry(multilinestring));
CREATE TABLE structures (id int, geom geometry(multipoint));
INSERT INTO pipes VALUES
(1,'0105000020950B00000100000001020000000200000046243EC3282608418D28242D6C1B3D4128531BE88A2608418284B3EF561B3D41'),
(2,'0105000020950B0000010000000102000000020000004ABF2CBC86B108413B93650696323D413C487924CCB10841925D490495323D41');
INSERT INTO structures VALUES
(1,'0104000020950B00000100000001010000001026FA48113B07410D6A8412CF1D3D41'),
(2,'0104000020950B0000010000000101000000BA1BF246E6DD0741D064CB58C2E43C41');
CREATE TABLE
CREATE TABLE
INSERT 0 2
INSERT 0 2
SELECT p.id,
(dump_line).geom,
ST_EndPoint((dump_line).geom) AS downstream,
geom_closest_downstream,
ST_StartPoint((dump_line).geom) AS upstream,
geom_closest_upstream
FROM pipes p,
LATERAL ST_Dump(p.geom) dump_line,
LATERAL (SELECT s.geom
FROM structures s
ORDER BY ST_EndPoint((dump_line).geom)<->s.geom
LIMIT 1) j (geom_closest_downstream),
LATERAL (SELECT s.geom
FROM structures s
ORDER BY ST_StartPoint((dump_line).geom)<->s.geom
LIMIT 1) i (geom_closest_upstream);
id | geom | downstream | geom_closest_downstream | upstream | geom_closest_upstream |
---|---|---|---|---|---|
1 | 0102000020950B00000200000046243EC3282608418D28242D6C1B3D4128531BE88A2608418284B3EF561B3D41 | 0101000020950B000028531BE88A2608418284B3EF561B3D41 | 0104000020950B00000100000001010000001026FA48113B07410D6A8412CF1D3D41 | 0101000020950B000046243EC3282608418D28242D6C1B3D41 | 0104000020950B00000100000001010000001026FA48113B07410D6A8412CF1D3D41 |
2 | 0102000020950B0000020000004ABF2CBC86B108413B93650696323D413C487924CCB10841925D490495323D41 | 0101000020950B00003C487924CCB10841925D490495323D41 | 0104000020950B00000100000001010000001026FA48113B07410D6A8412CF1D3D41 | 0101000020950B00004ABF2CBC86B108413B93650696323D41 | 0104000020950B00000100000001010000001026FA48113B07410D6A8412CF1D3D41 |
SELECT 2
SELECT p.id,
ST_AsText((dump_line).geom) AS dump_line,
ST_AsText(ST_EndPoint((dump_line).geom)) AS downstream,
ST_AsText(geom_closest_downstream) AS geom_closest_downstream,
ST_AsText(ST_StartPoint((dump_line).geom)) AS upstream,
ST_AsText(geom_closest_upstream) AS geom_closest_upstream
FROM pipes p,
LATERAL ST_Dump(p.geom) dump_line,
LATERAL (SELECT s.geom
FROM structures s
ORDER BY ST_EndPoint((dump_line).geom)<->s.geom
LIMIT 1) j (geom_closest_downstream),
LATERAL (SELECT s.geom
FROM structures s
ORDER BY ST_StartPoint((dump_line).geom)<->s.geom
LIMIT 1) i (geom_closest_upstream);
id | dump_line | downstream | geom_closest_downstream | upstream | geom_closest_upstream |
---|---|---|---|---|---|
1 | LINESTRING(197829.09533336962 1907564.1763329834,197841.36333336798 1907542.9363329713) | POINT(197841.36333336798 1907542.9363329713) | MULTIPOINT(190306.16063337075 1908175.0723329813) | POINT(197829.09533336962 1907564.1763329834) | MULTIPOINT(190306.16063337075 1908175.0723329813) |
2 | LINESTRING(202288.84188222355 1913494.0249874133,202297.51780945237 1913493.0167444688) | POINT(202297.51780945237 1913493.0167444688) | MULTIPOINT(190306.16063337075 1908175.0723329813) | POINT(202288.84188222355 1913494.0249874133) | MULTIPOINT(190306.16063337075 1908175.0723329813) |
SELECT 2