首页 > 解决方案 > TOP 1 的子查询在 Oracle NetSuite 中返回多于一行

问题描述

尽管使用了 TOP 1,但子查询返回不止一行。

我一生中大部分时间都在使用 MS SQL,我确信以下代码可以工作,但在 Oracle (NetSuite) 中却不行。

我正在尝试使用 TRANSACTION_ID 列将表 TRANSACTIONS 中的行与表 SYSTEM_NOTES 中的行连接起来,即对于 TRANSACTIONS 中的每一行,只应返回 SYSTEM_NOTES 中的一行。

SYSTEM_NOTES 表可能没有、一行或多行,其 TRANSACTION_ID 与 TRANSACTION 表中的行匹配。

查询应该只返回最新的行(根据 SYSTEM_NOTES 表中的 DATE_CREATED 列确定)。

SELECT 
    SS.NAME AS "ENTITY NAME", 
    TL.TRANSACTION_ID AS "TRANSACTION INTERNAL ID", 
    WF.VALUE_NEW AS "APPROVED BY",
    WF.DATE_CREATED AS "APPROVED DATE",
    TL.AMOUNT AS "AMOUNT (entity currency)",
    (CASE WHEN TL.AMOUNT_FOREIGN IS NULL THEN TL.AMOUNT ELSE TL.AMOUNT_FOREIGN END) AS "AMOUNT (original currency)",
    CY.SYMBOL AS "CURRENCY CODE"
FROM TRANSACTIONS TS
LEFT OUTER JOIN ACCOUNTS AC ON TL.ACCOUNT_ID  = AC.ACCOUNT_ID
LEFT OUTER JOIN ACCOUNTING_PERIODS AP ON TS.ACCOUNTING_PERIOD_ID = AP.ACCOUNTING_PERIOD_ID
LEFT OUTER JOIN 

/* The following part for some entries returns more than one row despite using TOP 1 */

(SELECT TOP 1 SN.TRANSACTION_ID, SN.VALUE_NEW, SN.DATE_CREATED FROM SYSTEM_NOTES SN WHERE SN.STANDARD_FIELD = 'NEXTAPPROVER' AND SN.VALUE_NEW IS NOT NULL
ORDER BY SN.DATE_CREATED DESC) 
WF ON WF.TRANSACTION_ID = TS.TRANSACTION_ID
/* End of the faulty part */

WHERE TL.AMOUNT IS NOT NULL AND TL.AMOUNT <> 0
AND TS.IS_NON_POSTING = N'No'
AND (AP.QUARTER = N'No' AND AP.YEAR_0 = N'No' AND CAST(AP.STARTING AS DATE) BETWEEN {d '2018-12-01'} AND {d '2018-12-01'})

当我为一个事务 ID 单独运行子查询时,我只得到了预期的 1 行(SYSTEM_NOTES 表中有三个具有该 ID 的条目)。

SELECT TOP 1 
SN.TRANSACTION_ID, 
SN.VALUE_NEW, SN.DATE_CREATED FROM SYSTEM_NOTES SN WHERE SN.STANDARD_FIELD = 'NEXTAPPROVER' AND SN.VALUE_NEW IS NOT NULL AND SN.TRANSACTION_ID = 171954
    ORDER BY SN.DATE_CREATED DESC

我也尝试了以下代码,但 row_number() 部分似乎在我的系统中不起作用。

SELECT SN.TRANSACTION_ID, SN.VALUE_NEW, SN.DATE_CREATED,
ROW_NUMBER() OVER (ORDER BY SN.DATE_CREATED DESC ) AS ROW_NUM
 FROM SYSTEM_NOTES SN 
WHERE SN.STANDARD_FIELD = 'NEXTAPPROVER' AND SN.VALUE_NEW IS NOT NULL
AND SN.TRANSACTION_ID = 171954

标签: sqloraclenetsuite

解决方案


我认为你应该使用rownum而不是TOP.

句法:

 select * from dual where /*conditions*/ and rownum = 1

我为你做了一个例子:

  • rownum

示例 - rownum = 1

  • row_number

示例 - row_number()


推荐阅读