【问题标题】:Iterate through Oracle SQL query results line by line, and produce sub-queries逐行迭代Oracle SQL查询结果,产生子查询
【发布时间】:2021-12-18 17:29:00
【问题描述】:

如果有以下查询(我的查询的简化示例,为了便于阅读):

SELECT make, year, color, count(*) 
FROM cars
GROUPY BY make, year, color
ORDER BY 4 DESC;

我想遍历结果表并为每行的条件生成子查询(下面的示例)。然后,我希望使用这些子查询来制作一个包含样本结果(可能是 3 行)的表,该表符合原始查询结果中每一行的标准(例如,因为 2019 年有多个黑色吉普车)。

SELECT * from cars 
WHERE make = 'Jeep'
AND  year = '2019'
AND color = 'Black';


SELECT * from cars 
WHERE make = 'Ford'
AND year = '2018'
AND color = 'Red';

这似乎是一个奇怪或不必要的请求。但是,考虑到我的实际问题的复杂性,我相信这是最好的方法。这是我想要采用的方法,因为我想要一个简化的解决方案,我可以返回并更改以供将来使用和查询的不同变体。

也许我可以使用一个 PLSQL 过程来创建一个临时表来存储每一行​​的值?我在想我可以将列值存储在变量中,这样我就可以从中构建我的子查询。让我知道您的想法,或者您是否有更好的方法。谢谢!

注意:我使用的是 Oracle SQL Developer

【问题讨论】:

  • 幽默我们,您的实际问题是什么?这几乎是对一个简单的分析计数函数的尖叫。
  • 随时提供您的方法!只是我遇到的一个问题是,我希望回来并将这个过程重用于不同的查询变体。因此,如果您有一个可以将查询作为输入的函数的想法,那就太好了。
  • 已经有一个答案与我的思路相同(只是缺少 count(*) over (partition by make,year,color) ) - 一次通过表而不是一加几个额外的查询(需要大索引来支持)

标签: sql oracle stored-procedures plsql


【解决方案1】:

您可以使用ROW_NUMBER() 检索每个组最多三行。例如:

select *
from (
  select c.*,
    row_number() over(partition by make, year, color order by id) as rn
  from cars c
) x
where rn <= 3

结果:

 MAKE  YEAR  COLOR  ID   RN 
 ----- ----- ------ ---- -- 
 1     2     3      100  1  
 1     2     3      101  2  
 1     2     3      102  3  
 4     2     3      104  1  
 4     2     3      105  2  
 4     2     7      106  1  

请参阅db<>fiddle 的运行示例。

【讨论】:

  • 所以我尝试使用汽车以外的多个表。但是在执行此操作时,我与连接图的其余部分断开连接。我是否仍然可以对多个表执行此方法?
  • 作为一般答案,是的,最有可能将此策略用于多个连接和相关表。但是,在没有看到实际细节的情况下很难确定地说。我会问另一个问题。
  • 我在下面的链接中提供了查询。感谢您一直以来的帮助! stackoverflow.com/questions/69841345/…
  • 您提供的解决方案似乎需要很长时间才能运行。查询的详细信息附在上面的链接中。如果您有任何建议,请告诉我。当我手动完成该过程时(我希望使用此查询自动化),生成所需输出的运行时不会花费太长时间(一两个小时)。但是,当我运行您的解决方案时,它会持续运行一整天,然后由于数据库连接超时,Oracle 会停止该进程。让我知道你的想法!
猜你喜欢
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多