我正在研究 Oracle Text 搜索的好处,目前正在研究从多个(相关)表中收集搜索文本数据,并将数据以一对多的关系存储在较小的表中。
考虑这两张简单的桌子,房子和居民,从来没有任何无人居住的房子:
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
我想编写 SQL,用来自 INHABITANT 的文本更新 HOUSE.Search_Text 列。现在因为这是一对多,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
一些问题:
- 这是返回此数据的有效查询吗?我有点担心不同的。
- 这是跨多个文本字段使用 Oracle Text 搜索的正确方法吗?
- 如何使用上述结果更新 House.Search_Text?我想我需要一个相关的子查询,但不能完全解决。
- 创建一个只包含 House_ID 和 Search_Text 的新表,而不是更新 House 会更有效吗?