PostgreSQL 多个pg_trgm相似度得分子查询

PostgreSQL multiple pg_trgm similarity score sub-query

我是 SQL 的新手,我正在努力处理子查询。我有一个看起来像这样的 table:

      sss        | mm | sid 
------------------+----+-----
IBM LTD          |    | 003
I.B.M.           |    | 003
A.BM LTD         |    | 004
IMB LTD          |    | 004
IMB UK           |    | 005
IBMUK LTD        |    | 006
IBMUKLTD         |    | 007
IBM LIMITED      |    | 008
IBM U.K.         |    | 008
IBM U.K. LIMITED |    | 009
I.B.M UK LTD     | 1  | 001
IBM              | 1  | 001
IBM UK           | 1  | 001
IBM UK LTD       | 1  | 001

mm列中带1的行是手动匹配的行,ID正确。我想使用 similarity 函数尝试找到与已手动匹配的记录的接近匹配项。

我知道通常你会在 from 语句中放置一个子查询,但我不能用 similarity 函数这样做,但我不知道该怎么做,这就是我想做:

SELECT 
    sss, 
    similarity(sss, select(sss from tusm where mm = 1) as match_score)
from 
    tusm 
where 
    mm is null and
    where match_score >= 0.5
;

你这里有一些问题。您不能在 where 子句中使用列别名,您试图在括号的错误一侧分配列别名,您不能将集合提供给 similarity 的第二个参数,并且您已经通常只是在几个地方破坏了语法。

为了克服similarity无法处理集合,做一个自连接:

select a.sss as a_sss, b.sss as b_sss, similarity(a.sss, b.sss) as score from
tusm a, tusm b 
where a.mm is null and b.mm = 1 and 
similarity(a.sss, b.sss)  > 0.5;

给予

   a_sss   |   b_sss    |  score
-----------+------------+----------
 IBM LTD   | IBM UK LTD | 0.727273
 IBMUK LTD | IBM UK LTD | 0.615385

如果 table 变大,将很难使它表现良好。