微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL查询不断告诉我我缺少右括号,但是我没有

如何解决SQL查询不断告诉我我缺少右括号,但是我没有

任何人都可以看到此查询出了什么问题吗

INSERT INTO CAND_SEARCH_RESULT_IDS (csr_id,sort_seq,cand_id) 
    SELECT
        358572 csr,rownum sort_seq,c.cand_id 
    FROM 
        candidates c 
    WHERE 
        EXISTS (SELECT cv.cand_id 
                FROM candidate_visibility cv
                WHERE c.cand_id = cv.cand_id AND cv.client_id = 'client')
        AND c.status IN ('AP','UC','IC','UI')
        AND (c.client_id = 'client')
        AND (c.cand_id IN (SELECT score(1) score,cand_id 
                           FROM cand_kw 
                           WHERE client_id = 'client' 
                             AND (CONTAINS(kw,'customer service',1) > 0)
                           ORDER BY score(1) DESC));

它总是告诉我我缺少右括号,但我没有。问题出在c.cand_id部分中的查询中。如果我提取

    SELECT
        score(1) score,cand_id 
    FROM
        cand_kw 
    WHERE
        client_id = 'client' 
        AND (CONTAINS(kw,1) > 0)
    ORDER BY
        score(1) DESC 

它运行完美。

我正在使用一个具有20年历史的应用程序上的旧Oracle 9i数据库,该数据库无法更新。

解决方法

从子查询中删除order-by子句:

...
and ( c.cand_id in 
     (
        SELECT
--           SCORE(1) score,cand_id 
        from
           cand_kw 
        WHERE
           client_id = 'client' 
           AND 
           (
              CONTAINS(kw,'customer service',1) > 0
           )
--        ORDER BY
--           SCORE(1) DESC 
     )
   );

它在那里没有意义-对IN()的结果没有影响-并且在某些子查询中是非法的,具体取决于上下文。

因为在这种情况下解析器知道它是非法的,所以期望您在ORDER所在的子查询中看到右括号。它在那里看不到一个,因此引发了一个缺失的异常。该错误并不总是意味着左括号和右括号的数量不匹配,只是看不到它期望的位置。

如您所指出的,您还必须删除SCORE(1) score表达式和子查询的别名。您正在将c.cand_id值与该子查询返回的值列表进行比较;因此它只能有一个列。 (您可以比较成对的值,但这在这里没有帮助,除非您要查找特定的分数)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。