我有一个 QSO(无线电联系)记录数据库,我想按电台国家汇总。国家来自电台呼号的前缀,由ITU 前缀列表定义
不幸的是,这个前缀是可变长度的。例如,以 W 开头的所有内容都分配给美国,但大多数国家/地区都由一个或多个 2 字符前缀标识。有些需要 3 个字符的前缀,例如,3DA 到 3DM 是斯威士兰,但 3DN 到 3DZ 是 Fidji。
我可以像这样建立一个表:
CREATE TABLE country (
prefix varchar(3) primary key,
country varchar(10)
);
并使用相当丑陋的表达式执行简单的连接:
SELECT * from qso
INNER JOIN country
ON left(qso.callsign, length(country.prefix)) = country.prefix
可以理解的是,这使用嵌套循环执行连接。这是有道理的,因为如果没有额外的知识,即我的国家/地区表中的前缀不会重叠,此连接可能会为单个 QSO 返回多个国家/地区。
现在,我可以使用丑陋的 hack,在我的prefix
表中插入所有明确的 3 字符前缀,并使用等式连接。这将使我的前缀表的大小增加 150 倍,但自然允许使用 Hash 或 Merge Join。
但是,我的前缀不重叠,并且 QSO 已经被呼号索引,所以有一个明显有效的类似合并的算法来执行这个连接。
有什么方法可以将 Postgres 引入我正在考虑的连接算法?也许使用花哨的索引类型或特殊的匹配运算符?
注意:QSO 表类似于:
CREATE TABLE qso (
time_on timestamp primary key,
callsign varchar(10),
...
);
CREATE INDEX qso_callsign ON qso(callsign);