【问题标题】:SQL query keeps telling me I am missing a right parenthesis but I am notSQL 查询一直告诉我我缺少右括号,但我没有
【发布时间】:2021-01-07 19:43:23
【问题描述】:

谁能看出这个查询有什么问题:

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, 'customer service', 1) > 0)
    ORDER BY
        SCORE(1) DESC 

效果很好。

我在一个 20 年前无法更新的应用程序上使用旧的 Oracle 9i 数据库。

【问题讨论】:

    标签: oracle oracle9i


    【解决方案1】:

    从子查询中删除 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 值与该子查询返回的值列表进行比较;所以它只能有一个列。 (您可以比较成对的值,但这在这里没有帮助,除非您正在寻找特定的分数)。

    【讨论】:

    • 我还必须删除 SCORE(1) 分数,才能运行此查询,否则我会得到许多值的错误。这是否意味着包含不是按分数排序的?
    • 是的,我没有超越最初的错误。子查询不是按分数排序的,不是。没有区别 - ID 在列表中或不在列表中,它在列表中的位置无关紧要。
    • @user794846:您得到“太多值”,因为您的子查询返回多个值,但您的 IN 子句仅与单个值进行比较。正如@AlexPoole 所说,去掉 ORDER BY 并如你所说,去掉 SELECT 列表中的 SCORE(1) score,你应该没问题。
    猜你喜欢
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 2021-12-21
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    相关资源
    最近更新 更多