sql - 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
解决方案
我认为你应该使用rownum
而不是TOP
.
句法:
select * from dual where /*conditions*/ and rownum = 1
我为你做了一个例子:
- 与
rownum
:
- 与
row_number
:
推荐阅读
- command-prompt - 在我的命令提示符下,总是出现“命令未被识别为内部或外部命令、可运行程序或批处理文件”
- .net - ASP.NET Core (.NET 5) + Angular 11 = 在空项目上构建错误
- nginx - 如何将 GitLab 放在 nginx 后面
- javascript - Firebase 提取对象的名称
- core-data - 我如何(或应该?)用嵌套的 managedObjectContext 替换这个 CoreData SwiftUI 应用程序中的 MVVM?
- javascript - 如何防止父对象激活子对象的事件
- javascript - 如何将第二个文本框中的日期设置为第一个文本框的日期 + 1
- python - 如果集合中的前一个文档包含某个值,我如何不创建新文档?
- javascript - 从javascript中的localStorage中删除嵌套项目
- r - R用mtcars编程饼图