当前位置: 首页 > 面试题库 >

Oracle在多个表和联接上进行文本搜索

唐哲
2023-03-14
问题内容

我有以下SQL语句。

select emp_no,dob,dept_no from v_depts
where catsearch (emp_no,'abc',NULL) > 0
or
catsearch (dept_no,'abc',NULL) > 0

v_depts视图在哪里。

现在,我想添加一个或多个表作为联接,以便我可以在列上进行文本搜索,例如employee_details包含员工信息,并且可以与emp_no

我已经在employee_details表上为emp_name列创建了索引,但是由于我将sql语句修改为,因此无法与v_depts一起进行搜索

select a.emp_no,a.dob,a.dept_no from v_depts a left outer join employee_details b
on (a.emp_no = b.emp_no)
where catsearch (a.emp_no,'abc',NULL) > 0
or
catsearch (a.dept_no,'abc',NULL) > 0
or
catsearch (b.emp_name,'abc',NULL) > 0

它给我错误

ORA-20000: Oracle Text error:
DRG-10849: catsearch does not support functional invocation
DRG-10599: column is not indexed

即使我已经为employee_details表中的emp_name列创建了索引。我怎么解决这个问题?

emp_name的索引语句

CREATE INDEX IDX_EMP_DETAILS ON EMPLOYEE_DETAILS(EMP_NAME)INDEXTYPE IS CTXSYS.CTXCAT

问题答案:

我通常通过实例化它们的结构化XML视图,然后在整个XML上创建索引,来解决对不同表的多个列进行全文搜索的问题。

此解决方案是通用的,还使您可以自由搜索:整个视图或仅一个子路径。缺点是管理通常无法快速刷新的MV的刷新。但是全文索引的更新通常也不是实时的,因此您可以对其进行调度。

-- Crating the view
CREATE MATERIALIZED VIEW fulltext_helper
NOLOGGING
BUILD DEFERRED
REFRESH COMPLETE ON DEMAND
AS
SELECT 
   a.dob, -- we don't need to fulltext on him
   XMLELEMENT(helper,
     XMLFOREST(a.emp_no AS emp_no, 
              a.dept_no AS dept_no, 
              b.emp_name AS emp_name)
   ) AS indexme
FROM v_depts a 
LEFT OUTER JOIN employee_details b
ON (a.emp_no = b.emp_no);

-- Creating the index
BEGIN
    ctx_ddl.create_preference('fulltext_helper_lexer', 'BASIC_LEXER');
    ctx_ddl.create_preference('fulltext_helper_filter', 'NULL_FILTER');
END;
/
CREATE INDEX fulltext_helper_index ON fulltext_helper (indexme)
INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS (
    'DATASTORE CTXSYS.DIRECT_DATASTORE
     LEXER fulltext_helper_lexer
     FILTER fulltext_helper_filter');

-- Searching the whole data
SELECT * FROM fulltext_helper
WHERE contains(indexme, '{abc} INPATH (/helper)') > 0;

-- Searching only on "empno"
SELECT * FROM fulltext_helper
WHERE contains(indexme, '{abc} INPATH (/helper/emp_no)') > 0;


 类似资料:
  • 问题内容: 我该怎么做? File1 看起来像这样: File2 看起来像这样: 我想做的是找到 字段 1,2和3 相同时在 File1 和 File2 中同时出现的行。 __ 有办法吗? 问题答案: 你可以试试看 输出 如果要省略不常见的行 输出

  • 问题内容: 大多数SQL方言都接受以下两个查询: 现在显然当您需要外部联接时,需要第二种语法。但是,在进行内部联接时,为什么我应该更喜欢第二种语法(反之亦然)? 问题答案: 在大多数现代数据库中,不赞成使用仅列出表并使用子句指定连接条件的旧语法。 这不仅是为了展示,当您在同一查询中同时使用INNER和OUTER联接时,旧语法可能会变得模棱两可。 让我给你举个例子。 假设您的系统中有3个表: 每个表

  • 我有2个表。第一个表SEC_SEAL_LOG列: 第二个带列的表: 我想把这两张表放在一起,但我不明白哪里有错误,我将感谢您的帮助。 我收到了这个错误 ORA-20999:无法解析SQL查询! ORA-06550:第7行,第4列:ORA-00918:列定义模糊

  • 我对以下查询有问题: 这个想法是把包括邮资在内的订单总价拿回来。 已订购的项目-包括所有已订购的项目(因此可以有多行) 订单-包括订单的邮资价格(这里每个订单只有一行) 我遇到的问题是,如果订单中包含多个“ordered_items”项目,则上述金额会多次计算“orders”中的邮资。 如何重写此查询,使邮资只计算一次? 提前感谢任何帮助。

  • 问题内容: 我正在尝试运行以下查询,但继续遇到相同的错误 查询失败错误:在第6行第33列遇到“”。 查询是: 从[Dataset1.1_0_MEMBER_GROUP]中 选择1_0_MEMBER_GROUP.User_Group, 1_0_MEMBER_GROUP.Member_ID, 1_4_MEMBER_TRAN_YEAR.MEMBER_UID 在1_0_MEMBER_GROUP_YEAR_M

  • 问题内容: 我正在尝试在多个表的ORACLE数据库中强制执行CHECK约束 …但出现以下错误: 原因:语句中的此处不允许子查询。操作:从语句中删除子查询。 您能帮助我了解问题所在或如何获得相同的结果吗? 问题答案: 在Oracle中,检查约束非常有限。要像您建议的那样进行检查,您必须实现PL / SQL触发器。 我的建议是完全避免触发。实现一个存储过程,该过程可以修改数据库并包括检查。尽管存储过程