Eu tenho duas tabelas onde a tabela A
tem uma coluna de geometria (4326) que contém superfícies (~ 20M). Uma segunda tabela B
tem ~ 500K pontos (4326). O que eu quero fazer é "sinalizar" (adicionando uma coluna booleana) cada superfície A
que contém pelo menos um dos pontos em B
.
Eu fiz isso:
CREATE TABLE foo_data AS
SELECT
A.*,
(SELECT EXISTS (SELECT ST_Contains(A.geom, B.geom) FROM B)) as flagged
FROM A;
Mas eu tenho todos os valores "sinalizados" como true
(o que é impossível).
Com joins/lateral não fui muito longe.
Qualquer ideia?
Você está perto. Eu não usaria
EXISTS
, o que é realmente útil apenas para reduzir um conjunto. Eu iria comCROSS JOIN LATERAL
e depoiscoalesce
o resultado. Veja como isso funciona.Isso deve funcionar em um índice se você tiver um índice espacial em
a.geom
eb.geom
(e você deve ter índices para essa carga de trabalho). Isso também parece que você está armazenando em cache os resultados para meras melhorias de desempenho. Eu sugeriria em circunstâncias normais umMATERIALIZED VIEW
.Alternativamente, você deve ser capaz de ir,
O problema é que ST_Contains retornará um valor em qualquer caso (ou seja, se o relacionamento espacial for verdadeiro/falso). Em vez disso, eu escreveria a consulta da seguinte forma:
ou alternativamente: