【问题标题】:Iterate through Oracle SQL query results line by line, and produce sub-queries - not running efficiently逐行遍历 Oracle SQL 查询结果,并产生子查询 - 运行效率不高
【发布时间】:2021-12-21 09:15:48
【问题描述】:

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

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';

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

我目前使用 ROW_NUMBER() 作为我的方法(如下),每组最多检索三行。虽然这可以为我编译,但它从未运行完成,因为它的运行时间很长。当我手动完成该过程时(我希望使用此查询自动化),生成所需输出的运行时不会花费太长时间(一两个小时)。但是,当我运行此解决方案时,它会持续运行一整天,然后由于数据库连接超时,Oracle 会停止该进程。有没有人有更好的方法来解决这个问题,或者让这个问题更有效地运行?

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

注意:我使用的是 Oracle SQL Developer

【问题讨论】:

  • 您只需要选择语句吗?或者您将在 proc 或函数中使用这些查询?
  • 我愿意接受任何方法,谢谢。
  • 我现在回复了,因为我没有地方可以测试,你可以检查它是否适合你
  • 感谢您的想法,我希望将每组的样本行数限制为 3,我在您的方法中看不到这一点。此外,您的方法将从整个汽车表中提取,而不是从我的原始查询(此页面上的第一个查询)中提取查询结果
  • 它可以很容易地添加。我刚刚编辑了我的答案。你可以检查

标签: sql oracle plsql runtime


【解决方案1】:

您可以通过动态创建另一列来获取所有查询:

    SELECT DISTINCT make, year, color, 
'SELECT * from cars WHERE make =''' || make ||''' AND  year = ''' || year ||''' AND color = ''' || color ||'''' AS SELECT_STATEMENTS
FROM (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 = ''' || make || '''
  • 是的。我编辑了谢谢
猜你喜欢
  • 2021-12-18
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多