我有以下查询给出错误ORA-00905: missing keyword
。尽管过去几个小时不断努力,但我还是找不到语法。请帮忙。
SELECT a.DOCUMENT_CATEGORY,
a.template_id,
a.category_id,
a.REVIEW_CATEGORY,
a.WITH_BIDS,
a.WITH_FINAL_DOCUMENTS,
b.divn_id,
b.deptt_id,
a.vdr_id,
C.DEPARTMENT,
a.TEMPLATE_TITLE
FROM DCTM_VDR_REF_DTLS a, DCTM_VDR_REF_MASTER b, VW_DIVN_DIR c
WHERE b.DIVN_ID = c.DIVN_CODE
AND b.DEPTT_ID = c.SECTN_CODE
AND a.vdr_id = b.vdr_id
AND (b.REFERENCE_NUMBER, b.APPROVED_ON) IN
( SELECT MAX (REFERENCE_NUMBER), MAX (APPROVED_ON)
FROM DCTM_VDR_REF_MASTER
WHERE REFERENCE_NUMBER =
(SELECT DISTINCT
NVL (TRIM (MR_NUMBER), TRIM (TENDER_NO))
FROM EILEDMS.EIL_DOCUMENT_SV@EDMS_DBLINK
WHERE object_name =
'A307-0IC-JA-MR-7960-1030-157-FOA'
AND r_object_type =
'eil_foa_order_pr_doc'
AND ( title = 'FOA'
OR title = 'DRAFT FOA'))
AND APPROVED_ON IS NOT NULL
GROUP BY DIVN_ID, DEPTT_ID)
AND REVIEW_CATEGORY <> 'Delete Category'
AND (CASE (SELECT IS_SCHEDULE_LOCKED
FROM DCTM_VENDOR_SCHEDULE
WHERE SCH_ID = 359)
WHEN 0
THEN
1
WHEN 1
THEN
(a.template_id || '-' || a.category_id) IN
(SELECT template_id || '-' || category_id
FROM DCTM_VENDOR_SCH_UNLOCK_DTLS
WHERE APPROVAL = 'Y'
AND APPROVAL_UPTO >= SYSDATE
AND CONSUMED = 0
AND sch_ID = 359)
END) = 1
ORDER BY c.DEPARTMENT ASC,
a.TEMPLATE_ID,
a.SORT_ORDER,
a.DOCUMENT_CATEGORY ASC
我们不能在THEN语句中使用IN子句吗?
答案 0 :(得分:2)
现在您已经编辑了问题,看起来您只是想在DCTM_VENDOR_SCH_UNLOCK_DTLS中查找category_id和template_id。以下是否适用于您?
then
(
SELECT COUNT(*) -- 1 if found, 0 otherwise
FROM DCTM_VENDOR_SCH_UNLOCK_DTLS
WHERE APPROVAL = 'Y'
AND APPROVAL_UPTO >= SYSDATE
AND CONSUMED = 0
AND sch_ID = 359
AND template_id = a.template_id
AND category_id = a.category_id
AND rownum = 1
)
答案 1 :(得分:0)
这实际上并不是关于WHERE被允许之后的IN子句。表达式
a.category_id IN (SELECT ...)
评估为TRUE或FALSE。你的陈述
a.template_id || '-' || a.category_id IN (SELECT ...)
尝试使用a.template_id和减号连接TRUE或FALSE。这是不可能的,因为Oracle SQL中没有布尔类型。想一想你真正想要连接什么。
编辑:现在您设置括号,将字符串与select语句产生的另一个字符串进行比较。好到目前为止。但仍然:所有这些都是一个布尔值,而不是一个数字。然后你的第一个产生一个数字(1),你的第二个产生一个布尔值(TRUE或FALSE)。 Oracle SQL没有布尔类型,因此您的表达式对解析器没有意义,并且您会收到语法错误。