我有一個QSO(無線電聯繫)記錄的數據庫,我希望按站點國家彙總。該國家由電話呼號的前綴派生,如ITU Prefix List在連接字段的非重疊前綴時是否可以避免嵌套循環連接?
所定義的。不幸的是,這個前綴的長度是可變的。例如,以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。
現在,我可以使用一個醜陋的黑客,並在我的prefix
表中插入所有明確的3個字符的前綴,並使用平等連接。這會增加我的前綴表的大小150倍,但自然允許使用哈希或合併加入。
但是,我的前綴不重疊,而且QSO已經通過呼號進行索引,所以有一個明顯高效的類似合併算法來執行此聯接。
有沒有什麼辦法可以將Postgres引導到我所想的連接算法?也許使用一個奇特的索引類型,或者一個特殊的匹配運算符?
注:通聯表是這樣的:
CREATE TABLE qso (
time_on timestamp primary key,
callsign varchar(10),
...
);
CREATE INDEX qso_callsign ON qso(callsign);
什麼是qso表結構? – 2013-05-11 22:07:50
將其添加到帖子中,但它可能與問題無關。 – b0fh 2013-05-11 22:16:02
你有沒有想過打破呼號分兩部分,前綴和其他?那有什麼問題?在問題中加入 – 2013-05-11 22:26:18