首页 > 解决方案 > Oracle SQL - 创建“未存储”过程

问题描述

我有这个 SQL 查询

SELECT ACCBAL_DATE, ACCBAL_AMOUNT
FROM ACCOUNT_BALANCES t
WHERE ACC_KEY = '964570223'
AND ACCBAL_KEY = '16'
ORDER BY ACCBAL_DATE DESC
FETCH FIRST 1 ROWS ONLY; 

它返回一行,但我需要将此查询用于许多 ACC_KEYS(大约 600 个)。

所以第一种方法是使用不同的 ACC_KEY 参数运行这个查询大约 600 倍。

第二个是创建我认为的程序。

将使用变量 acc_key 并将其移动到 WHERE 语句的过程。问题是由于权限,我无法创建存储在服务器上的过程。

有没有办法在不将程序存储在服务器上的情况下解决它?

编辑:我知道 IN 子句,但这不是我需要的。我需要一些可以运行大约 600 倍的查询,每次执行都在 WHERE 子句中使用另一个 ACC_KEY,并且输出应该是 600 行。

标签: sqldatabaseoracle

解决方案


当我在子句 IN 中使用它们时,它仍然只会返回一行。我只想返回一行,因为没有限制它返回大约 100 行,所以我只想要需要数据的第一行。对于每个 ACC_KEY 它应该只返回一行

您仍然可以使用IN()列出所有 600 个键值的子句来做到这一点:

select acc_key,
  max(accbal_date) as accbal_date,
  max(accbal_amount) keep (dense_rank last order by accbal_date) as accbal_amount
from account_balances t
where acc_key in ('964570223', '964570224', ...) -- up to 1000 allowed
and accbal_key = '16'
group by acc_key
order by acc_key;

这是使用聚合函数并按键分组,因此每个键将获得一行,其中包含最近日期的数据。

阅读有关 keep/last的更多信息。

使用集合或表格仍然会更好 - 可能是从 Excel 工作表加载的外部表格,保存为 CSV;不仅因为您只能为单个IN()子句或任何表达式列表提供 1000 个条目,而且还出于性能和可读性/维护的原因。


推荐阅读