Quando uno as entradas da tabela de pontos (n = 34, 436) à tabela mid_pts (n = 1,98 milhão), o número total de linhas de table_joined é n = 26.016. No entanto, quando adiciono a tabela unjoined_pts de n = 9.627 ao table_joined, ela não corresponde ao número da tabela 'point' original, excede-a em 1207.
Seguem exemplos das tabelas que possuo:
tabela de pontos:
LIC_LI_NO | DESCRITOR | Atributo 1 | Atributo 2 | Atributo 3 |
---|---|---|---|---|
11112-01 | 04-81-09-01 | xx | xyz | xx |
11112-01 | 04-81-09-01 | xyz | x | x |
11119-03 | 04-81-09-01 | xx | xx | xyz |
11117-05 | 04-81-09-01 | xx | xyz | xyz |
tabela mid_pts
LIC_LI_NO | ORIG_LICLI | DESCRITOR |
---|---|---|
11112-01 | 11112-01 | 04-81-09-01 |
11112-01 | 11112-01 | 04-81-09-01 |
11119-03 | 11119-03 | 04-81-09-01 |
129517-05 | 11117-05 | 04-81-09-01 |
10000-01 | 10000-01 | 04-81-09-01 |
100232-01 | 100232-01 | 04-81-09-01 |
19-03 | 19-03 | 04-81-09-01 |
117-05 | 117-05 | 04-81-09-01 |
112-01 | 112-01 | 04-81-09-01 |
A tabela abaixo é o que eu esperava, mas por algum motivo, conforme sugerido por Laurenz Albe, uma única linha na minha tabela de pontos pode estar relacionada a várias linhas na tabela mid_pts. Eu gostaria que cada linha na tabela de pontos se juntasse a apenas uma linha de candidato na tabela mid_pts.
table_joined
LIC_LI_NO | ORIG_LICLI | DESCRITOR | Atributo 1 | Atributo 2 | Atributo 3 |
---|---|---|---|---|---|
11112-01 | 11112-01 | 04-81-09-01 | xx | xyz | xx |
11112-01 | 11112-01 | 04-81-09-01 | xyz | x | x |
11119-03 | 11119-03 | 04-81-09-01 | xx | xx | xyz |
129517-05 | 11117-05 | 04-81-09-01 | xx | xyz | xyz |
CREATE TABLE table_joined AS
SELECT m.geom, m.lic_li_no, m.orig_licli, p.id, p.descriptor, ...
FROM mid_pts m
JOIN point p
ON CASE
WHEN p.lic_li_no = m.lic_li_no THEN 1
WHEN p.lic_li_no = m.orig_licli THEN 1
ELSE 0 END = 1
AND
(p.descriptor = m.descriptor)
;
Quando avaliado quantos pontos não juntaram, obtenho 9.627.
CREATE TABLE unjoined_pts AS
SELECT
p.*
FROM point p
WHERE NOT EXISTS (SELECT * FROM table_joined m
WHERE m.id = p.id)
;
Solução simples:
Isso seleciona uma linha arbitrária entre as linhas correspondentes
mid_pts
para cada linha qualificada na tabelapoint
- se houver alguma correspondência após oINNER JOIN
. (Você pode quererLEFT JOIN
preservar pontos sem correspondência? Mova as expressões de filtro para a cláusula de junção neste caso.)Como você não divulgou as definições da tabela, estou voltando
ctid
para identificar as linhas de maneira exclusiva. (Use o PK se houver um.)Para suas poucas partidas por ponto (perto de uma),
DISTINCT ON
deve ter um desempenho muito bom. Ver:Sobre
ctid
: