我正在调查Oracle Text搜索的好处,目前我正在研究从多个(相关)表中收集搜索文本数据,并将这些数据以1对多的关系存储在较小的表中。
考虑这两个简单的表,房子和居民,并且从来没有任何无人居住的房子:
HOUSE
ID Address Search_Text
1 44 Some Road
2 31 Letsby Avenue
3 18 Moon Crescent
INHABITANT
ID House Name Nickname
1 1 Jane Doe Janey
2 1 John Doe JD
3 2 Jo Smythe Smithy
4 2 Percy Plum PC
5 3 Apollo Lander Moony
我想编写使用INHABITANT中的文本更新HOUSE.Search_Text列的SQL。现在因为这是1对多,SQL需要为内部的每个匹配行整理INHABITANT中的数据,然后组合数据(以逗号分隔)并更新Search_Text字段。
完成后,HOUSE.Search_Text上的Oracle Text搜索索引将返回符合搜索条件的HOUSE,我可以相应地查找INHABITANT。
当然,这是一个非常简单的示例,我希望从两个表中的多个列中获取数据,并跨两个表中的字段进行全文搜索。
在同事的帮助下,我们得到了:
select id, ADDRESS||'; '||Names||'; '||Nicknames as Search_Text
from house left join(
SELECT distinct house_id,
LISTAGG(NAME, ', ') WITHIN GROUP (ORDER BY NAME) OVER (PARTITION BY house_id) as Names,
LISTAGG(NICKNAME, ', ') WITHIN GROUP (ORDER BY NICKNAME) OVER (PARTITION BY house_id) as Nicknames
FROM INHABITANT)
i on house.id = i.house_id;
返回:
1 44 Some Road; Jane Doe, John Doe; JD, Janey
2 31 Letsby Avenue; Jo Smythe, Percy Plum; PC, Smithy
3 18 Moon Crescent; Apollo Lander; Moony
有些问题: