1

我正在研究 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

一些问题:

  1. 这是返回此数据的有效查询吗?我有点担心不同的。
  2. 这是跨多个文本字段使用 Oracle Text 搜索的正确方法吗?
  3. 如何使用上述结果更新 House.Search_Text?我想我需要一个相关的子查询,但不能完全解决。
  4. 创建一个只包含 House_ID 和 Search_Text 的新表,而不是更新 House 会更有效吗?
4

0 回答 0