【发布时间】:2019-06-27 04:38:29
【问题描述】:
我有一个CONTRACTINFO 表,其中存储了合同的折扣代码(代码可能会不时更改,具体取决于合同的类型或期限)。
CREATE TABLE CONTRACTINFO
(
ID CHAR(8),
BASERECORD CHAR(1),
DATE CHAR(8),
DISCOUNTCODE CHAR(1)
)
每个月,我们需要根据paymentdate 和discountcode 计算客户必须支付的费用。
CREATE TABLE PAYMENT
(
CONTRACTID CHAR(8),
TIME NUMBER(12),
PAYMENTDATE CHAR(8)
)
折扣码是通过从CONTRACTINFO 表中获取date paymentdate 的最后一条记录来确定的。
我创建了一个简单的示例来显示所需的结果(黄色)。
在 SQL Server 中,我可以使用以下相关子查询轻松实现此目的:
SELECT
PA.*,
(SELECT TOP 1 DISCOUNTCODE
FROM CONTRACTINFO
WHERE ID = PA.CONTRACTID
AND DATE < PA.PAYMENTDATE
ORDER BY DATE DESC) AS DISCOUNTCODE
FROM
PAYMENT PA
INNER JOIN
CONTRACTINFO CI ON PA.CONTRACTID = CI.ID
WHERE
CI.BASERECORD = 1 'ALWAYS GET INFORMATION FROM THE BASE RECORD
但在 Oracle SQL 中我不能,因为它没有 top 1 函数。
我也不能使用 rownum 或 row_number,因为 Oracle 不允许我像这样将主查询列中的值传递到嵌套子查询中。 (下面的代码会产生“column PA.PAYMENTDATE not found”错误)
SELECT
PA.*,
(
SELECT DISCOUNTCODE FROM
(SELECT * FROM CONTRACTINFO WHERE ID = PA.CONTRACTID AND DATE < PA.PAYMENTDATE ORDER BY DATE DESC)
WHERE ROWNUM = 1
)
AS DISCOUNTCODE
FROM PAYMENT PA
INNER JOIN CONTRACTINFO CI
ON PA.CONTRACTID = CI.ID
WHERE CI.BASERECORD = 1 'ALWAYS GET INFORMATION FROM THE BASE RECORD
【问题讨论】:
-
您是否尝试在末尾添加
FETCH NEXT 1 ROWS?这在ORDER BY子句之后也适用于 SQL Server -
在 Oracle 中,
fetch first row only或fetch first 2 rows only表示超过 1 行,加上可选的percent和with ties子句。
标签: sql oracle oracle11g correlated-subquery