当我将点表 (n = 34, 436) 中的条目连接到 mid_pts 表 (n=198 万) 时,table_joined 的总行数为 n = 26,016。但是,当我将 n = 9,627 的 unjoined_pts 表添加到 table_joined 时,它与原始“点”表编号不匹配,超过了 1207。
以下是我拥有的表格的示例:
积分表:
LIC_LI_NO | 描述符 | 属性 1 | 属性 2 | 属性 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 |
mid_pts 表
LIC_LI_NO | ORIG_LICLI | 描述符 |
---|---|---|
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 |
下表是我所期望的,但出于某种原因,正如 Laurenz Albe 所建议的,我的点表中的一行可能与 mid_pts 表中的多行相关。我希望 points 表中的每一行仅连接到 mid_pts 表中的一个候选行。
表连接
LIC_LI_NO | ORIG_LICLI | 描述符 | 属性 1 | 属性 2 | 属性 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)
;
当评估有多少点没有加入时,我得到 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)
;
简单的解决方案:
mid_pts
这会在表中的每个符合条件的行的匹配行中选择一个任意行point
- 如果它在INNER JOIN
. (你可能想LEFT JOIN
在没有匹配的情况下保留点?在这种情况下将过滤器表达式移动到连接子句。)由于您没有公开表定义,因此我将退回到
ctid
唯一标识行。(如果有 PK,请改用 PK。)对于你每分很少的比赛(接近一场),
DISTINCT ON
应该表现得很好。看:关于
ctid
: