Oracle SQL,在SELECT标头的子查询中返回唯一(最大)行(在FROM之前,在何处)
我正在通过Oracle服务器上的业务对象运行SQL。我有以下代码(简化),有时会运行: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 =
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
. . .