在下面的代码中,“t”后的最后一行出现“SQL命令意外结束”错误,请帮助我解决问题。
(SELECT NVL(TO_CHAR(j,'DD-Mon-YYYY'),'NIL')
FROM
(SELECT *
FROM abc A
WHERE A.j =
(SELECT MAX(VALUE_DATE)
FROM abc
WHERE k = A.k
AND j <=
(SELECT TODAY
FROM DATES
WHERE B ='S'))
AND k IN (:t))
WHERE k =A.l)EFF_DATE
最佳答案
好吧,您发布的查询似乎不完整。那个领先的开放式支架在做什么?
使用CTE(以使查询运行),看起来不错:
SQL> var t number
SQL> exec :t := 1;
PL/SQL procedure successfully completed.
SQL> WITH abc
2 AS (SELECT SYSDATE j,
3 SYSDATE value_date,
4 1 k,
5 SYSDATE today,
6 'S' b
7 FROM DUAL),
8 dates AS (SELECT SYSDATE today, 'S' b FROM DUAL)
9 SELECT NVL (TO_CHAR (j, 'DD-Mon-YYYY'), 'NIL')
10 FROM (SELECT *
11 FROM abc a
12 WHERE a.j = (SELECT MAX (value_date)
13 FROM abc
14 WHERE k = a.k
15 AND j <= (SELECT today
16 FROM dates
17 WHERE b = 'S'))
18 AND k IN ( :t));
NVL(TO_CHAR
-----------
19-Aug-2020
SQL>
如果您发布这样的内容将很有帮助-复制/粘贴SQL * Plus session ,这样我们就可以看到您所做的和到底是什么,以及Oracle为何会这样做。添加其他条件后,看来您发布的整个查询实际上是
EFF_DATE
列的源。如果是这样的话(再一次:您发布了不完整的代码;很难猜测您在做什么),那么您就不能那样使用它,因为A
表在该位置超出范围:SQL> WITH abc
2 AS (SELECT SYSDATE j,
3 SYSDATE value_date,
4 1 k,
5 SYSDATE today,
6 'S' b,
7 1 l
8 FROM DUAL),
9 dates AS (SELECT SYSDATE today, 'S' b FROM DUAL)
10 SELECT (SELECT NVL (TO_CHAR (j, 'DD-Mon-YYYY'), 'NIL')
11 FROM (SELECT *
12 FROM abc A
13 WHERE A.j = (SELECT MAX (VALUE_DATE)
14 FROM abc
15 WHERE k = A.k
16 AND j <= (SELECT TODAY
17 FROM DATES
18 WHERE B = 'S'))
19 AND k IN ( :t))
20 WHERE k = A.l)
21 EFF_DATE
22 FROM DUAL;
WHERE k = A.l)
*
ERROR at line 20:
ORA-00904: "A"."L": invalid identifier
SQL>
但是,如果重写为 <snip>
10 SELECT (SELECT NVL (TO_CHAR (j, 'DD-Mon-YYYY'), 'NIL')
11 FROM (SELECT *
12 FROM abc A
13 WHERE A.j = (SELECT MAX (VALUE_DATE)
14 FROM abc
15 WHERE k = A.k
16 AND j <= (SELECT TODAY
17 FROM DATES
18 WHERE B = 'S'))
19 AND k IN ( :t)
20 AND k = A.l)) --> this
21 EFF_DATE
22 FROM DUAL;
EFF_DATE
-----------
19-Aug-2020
SQL>
看看是否有帮助。如果不是,请发布适当的测试用例(CREATE TABLE和INSERT INTO示例数据),以及所需的输出和从输入到输出的规则。
关于sql - SQL命令意外结束错误,请提出建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63481900/