我对SQL还不太熟悉,而且我正在处理一个子查询。我有一张这样的桌子:

      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

1列中有mm的行是已手动匹配且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

如果桌子变大,就很难让它表现得好。

09-27 15:53