Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL,在SELECT标头的子查询中返回唯一(最大)行(在FROM之前,在何处)_Sql_Oracle_Subquery - Fatal编程技术网

Oracle SQL,在SELECT标头的子查询中返回唯一(最大)行(在FROM之前,在何处)

Oracle SQL,在SELECT标头的子查询中返回唯一(最大)行(在FROM之前,在何处),sql,oracle,subquery,Sql,Oracle,Subquery,我正在通过Oracle服务器上的业务对象运行SQL。我有以下代码(简化),有时会运行: SELECT a.col1, a.col2, a.date1, ( SELECT b.date2 FROM tbl b WHERE b.ID = a.ID AND b.date2 >= a.date1-60 ) AS SUBDATE FROM tbl a WHERE a.col1 =

我正在通过Oracle服务器上的业务对象运行SQL。我有以下代码(简化),有时会运行:

SELECT
  a.col1,
  a.col2,
  a.date1,
    (
    SELECT
      b.date2
    FROM
      tbl b
    WHERE
      b.ID = a.ID
      AND
      b.date2 >= a.date1-60
    ) AS SUBDATE
FROM
  tbl a
WHERE
  a.col1 = 'foo'
  AND
  a.col2 = 'bar'
  AND
  a.date1 = '#somedate#'
如您所见,SELECT子句中有一个子查询,我想返回一个值:b.date2。这确实有效。。。有时候。但是,如果b.ID返回一条以上的记录,其中date2在date1的最后60天内,则查询失败

我要做的是将子查询的输出限制为date2的单个最新值。我试过各种各样的方法:最大,极限1,不同。。。但是SQL不会编译,告诉我有错误。例如,下面的TOP 1生成一个错误,称为“未在预期位置找到FROM关键字”:

以下ORDER BY/LIMIT生成一个错误,表示“缺少右括号”:

(仅复制上述子查询)

通过研究这些错误,我看到了关于主WHERE子句之后的子查询的各种建议;但是,关于子查询,我不想以我想要的方式使用它们

有人能帮我理解为什么我会出错,正确的方法应该是什么?做我想做的事


谢谢。

在这种情况下,Oracle可能会很麻烦(除非您使用的是Oracle 12)。一种方法使用
保留
。但是,在您的情况下,
max()
就足够了:

SELECT . . . 
     (SELECT MAX(b.date2)
      FROM tbl b
      WHERE b.ID = a.ID AND
            b.date2 >= a.date1 - 60
     ) AS SUBDATE
. . .

注意:您不需要子查询中的
date2
条件,除非您确实希望将结果限制在最近60天内。

在这种情况下,Oracle可能会很麻烦(除非您使用的是Oracle 12)。一种方法使用
保留
。但是,在您的情况下,
max()
就足够了:

SELECT . . . 
     (SELECT MAX(b.date2)
      FROM tbl b
      WHERE b.ID = a.ID AND
            b.date2 >= a.date1 - 60
     ) AS SUBDATE
. . .

注意:您不需要子查询中的
date2
条件,除非您真的想将结果限制在最近60天。

您在Oracle手册中的什么地方找到了
TOP 1
limit 1
中选择MAX(b.date2)应该有效。您可以将其替换为
MAX OVER
LAG OVER
…dnoeth-是的,谢谢!我在整个SELECT子查询之外尝试了Max(),但是没有在内部尝试:)Horse:老实说,我没有Oracle手册-我从来没有想到Oracle的SQL形式与其他任何形式都如此不同,以至于标准命令(如TOP和LIMIT)可能不包括在内。
TOP
LIMIT
都不是标准SQL:-)dnoeth-我有个新消息!非常感谢。作为一名SQLN00B,我必须通过实验和失败来学习,并在网上查找。有很多文档,但还没有明确告诉我什么是或什么不是“标准”SQL(直到最近我才知道不止一种)您在Oracle手册中的什么地方找到了
TOP 1
LIMIT 1
中选择MAX(b.date2)应该有效。您可以将其替换为
MAX OVER
LAG OVER
…dnoeth-是的,谢谢!我在整个SELECT子查询之外尝试了Max(),但是没有在内部尝试:)Horse:老实说,我没有Oracle手册-我从来没有想到Oracle的SQL形式与其他任何形式都如此不同,以至于标准命令(如TOP和LIMIT)可能不包括在内。
TOP
LIMIT
都不是标准SQL:-)dnoeth-我有个新消息!非常感谢。作为一名SQLN00B,我必须通过实验和失败来学习,并在网上查找。有很多文档,但还没有明确告诉我什么是或什么不是“标准”SQL(直到最近我才知道不止一种)我真的不明白你为什么不能在这里用MAX+1从我这里。:)我真的不明白你为什么不能在这里用MAX+1从我这里。:)
SELECT . . . 
     (SELECT MAX(b.date2)
      FROM tbl b
      WHERE b.ID = a.ID AND
            b.date2 >= a.date1 - 60
     ) AS SUBDATE
. . .