2015-06-12 2 views
1

Я довольно новичок в SQL, и я борюсь с суб-запросом. У меня есть таблица, которая выглядит следующим образом:PostgreSQL multiple pg_trgm оценка подобия sub-query

 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 
; 
+0

[документация] (http://www.postgresql.org/docs/9.1/static/pgtrgm.html) утверждает, что подобие должно быть определено как «подобие (столбец,« слово »)». Похоже, вы пытаетесь сделать «подобие (столбец, запрос)». Чтобы заставить ваш запрос работать, я думаю, вам нужно вернуть одну строку из вашего подзапроса. Дайте мне знать, если я не понимаю ваш вопрос. – jed

+0

Правильно Jed – woodbine

ответ

2

У вас здесь есть несколько проблем. Вы не можете использовать псевдонимы столбцов в предложении 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 

Если таблица становится большим, это будет трудно сделать это выполнить хорошо ,

+0

Это сработало спасибо. Число рейнольдса производительность, я строю жесткие ссылки, а не поиск в реальном времени, поэтому, к счастью, время не слишком насущно. – woodbine