У меня есть таблица 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)
)
Код скидки определяется путем получения последней записи, которая имеет date
<<code>paymentdate из таблицы CONTRACTINFO
.
Я создал простой пример для отображения желаемогорезультат (желтым цветом).
В 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 не позволяет мне передавать значение из столбца основного запроса во вложенный подзапрос, подобный этому.(приведенный ниже код сгенерирует ошибку «столбец PA.PAYMENTDATE не найден»)
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