我不经常使用ORACLE PL / SQL,但我需要了解该函数创建的其他内容是什么 在我之前的公司是错误的,因为它没有返回我被告知的最新记录。我在其他一些论坛上发现了他们的问题 建议使用max(dateColumn)而不是" row_numer = 1"例如,但不太确定如何以及在何处加入它。
- 知道 - 我们使用Oracle版本12, CustomObjectTypeA是由一些不再在此处的旧员工定义的自定义Oracle OBJECT TYPE, V_OtherView属于Table_Mnd类型,由一些不再在这里的老员工定义, V_ABC_123是一个不再在这里的老员工创建的视图。
CREATE OR REPLACE FUNCTION F_TABLE_APPROVED (NUMBER_F_UPD number, NUMBER_F_GET VARcHAR2)
RETURN Table_Mnd
IS
V_OtherView Table_Mnd
BEGIN
SELECT CustomObjectTypeA (FromT.NUMBER_F,
FromT.OP_CODE,
FromT.CATG_CODE,
FromT.CATG_NAME,
FromT.CATG_SORT,
FromT.ORG_CODE,
FromT.ORG_NAME
FromT.DATA_ENTRY_VALID,
FromT.NUMBER_RECEIVED,
FromT.YEAR_1,
FromT.YEAR_2)
BULK COLLECT INTO V_OtherView
FROM (SELECT NUMBER_F,
OP_CODE,
CATG_CODE,
CATG_NAME,
CATG_SORT,
ORG_CODE,
ORG_NAME
DATA_ENTRY_VALID,
NUMBER_RECEIVED,
YEAR_1,
YEAR_2,
ROW_NUMBER() OVER (PARTITION BY BY ORG_CODE ORDER BY NUMBER_RECEIVED DESC, LOAD_DATE DESC) AS ROW_NUMBER
FROM V_ABC_123
WHERE NUMBER_F = NUMBER_F_UPD AND DATA_ENTRY_VALID <> 'OnGoing'
AND LOAD_DATE >= (SELECT sysdate-10 FROM dual)
AND LOAD_DATE <= (SELECT DISTINCT LOAD_DATE
FROM V_ABC_123
WHERE NUMBER_RECEIVED = NUMBER_F_GET)) FromT
WHERE FromT.ROW_NUMBER=1;
RETURN V_OtherView;
END F_TABLE_APPROVED;
答案 0 :(得分:0)
查询的重要部分是:
SELECT ...
FROM (select ...,
ROW_NUMBER()
OVER (PARTITION BY ORG_CODE
ORDER BY NUMBER_RECEIVED DESC,
LOAD_DATE DESC) AS ROW_NUMBER
...) FromT
WHERE FromT.ROW_NUMBER = 1;
&#34; ROW_NUMBER&#34;列根据以下窗口子句计算:
PARTITION BY ORG_CODE
ORDER BY NUMBER_RECEIVED DESC, LOAD_DATE DESC
这意味着对于每个ORG_CODE
,它将按NUMBER_RECEVED,LOAD_DATE
降序排列所有记录。请注意,如果列是Oracle DATE
,则它们只能精确到最接近的秒;因此,如果有多个记录的日期/时间完全相同的1秒间隔,则此排序顺序将不会保证唯一。因此,ROW_NUMBER
的逻辑将任意挑选其中一个(即先发生的任何记录)并为其分配值#34; 1&#34;这将被视为&#34;最新& #34 ;.后续执行相同的SQL 可以(理论上)返回不同的记录。
可疑部分是NUMBER_RECEIVED
,听起来像是一个数字,而不是约会?通过这种方式排序意味着具有最高NUMBER_RECEIVED
的记录将是首选。这是故意的吗?
我不确定为什么PARTITION
存在,这会导致查询返回一个&#34;最新的&#34;记录它找到的ORG_CODE
的每个值。我只能假设这是故意的。
问题是查询只能确定&#34;最新记录&#34;以及它可以基于提供给它的数据。在这种情况下,数据可能不够精细,无法确定哪条记录是实际的&#34;最新的&#34;记录。