SQL命令意外结束错误,请提出建议?

问题描述

在下面的代码中,'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会话,这样我们就可以看到您确切地做了什么以及为什么Oracle会这样做。


添加其他条件后,看来您发布的整个查询实际上是EFF_DATE列的来源。如果是这样的话(再次:您发布了不完整的代码;很难猜测您在做什么),那么您就不能那样使用它,因为A表在该位置超出范围:>

SQL> WITH abc
  2       AS (SELECT SYSDATE j,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,'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,'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示例数据),以及所需的输出和从 input output 的规则。>

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...