SQL 查询一直告诉我缺少右括号,但我没有
SQL query keeps telling me I am missing a right parenthesis but I am not
谁能看出这个查询有什么问题:
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 数据库。
从子查询中删除 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
值与该子查询返回的值列表进行比较;所以它只能有一个列。 (您可以比较成对的值,但这在这里没有帮助,除非您要查找特定分数)。
谁能看出这个查询有什么问题:
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 数据库。
从子查询中删除 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
值与该子查询返回的值列表进行比较;所以它只能有一个列。 (您可以比较成对的值,但这在这里没有帮助,除非您要查找特定分数)。