要声明/设置查询的Oracle SQL方法?

2w2cym1i  于 2023-04-11  发布在  Oracle
关注(0)|答案(1)|浏览(132)

GBQ让我们执行下面的语句,它非常好地提高了我的查询效率:

DECLARE practices ARRAY<INT64>;

SET practices = (SELECT ARRAY(select distinct id from business));

select *
from business 
where business.id in UNNEST(practices)

我如何在Oracle DB w/ Oracle SQL上完成这种相同类型的预取?我想使用一组类似的SQL语句来重构现有的Oracle SQL查询,而不是低效的CTE。
P.S.我已经看过其他解决方案,如How to declare variable and use it in the same Oracle SQL script?,但是,这些解决方案似乎不适合我在Oracle SQL中工作,并且/或者它们被列在单独的执行行上。
即不工作:

DECLARE practices = 'My Practice Name';

select *
from business 
where business.name = '&practices'
y4ekin9u

y4ekin9u1#

举个简单的例子,不要取两次;只需在一个查询中完成所有操作:

SELECT *
FROM   business 
WHERE  id IN (SELECT id FROM business)
    • 注1:您不需要使用DISTINCT。*
    • 注2:可以将查询简化为SELECT * FROM business WHERE id IS NOT NULL *

如果你确实想将值放入数组中(大多数时候你可能不想这样做,你可能想过早地优化),那么你可以使用参数化的PL/SQL匿名块,并将值收集到一个集合中,以便在后续语句中使用:

DECLARE
  v_ids SYS.ODCINUMBERLIST;
BEGIN
  SELECT DISTINCT id
  BULK COLLECT INTO v_ids
  FROM   business;

  OPEN :your_out_bind_variable FOR
    SELECT *
    FROM   business
    WHERE  id IN (SELECT COLUMN_VALUE FROM TABLE(v_ids));
END;
/

并使用bind变量将游标绑定到out参数,您可以从任何用于访问数据库的语言(PHP、Java、C#等)访问该参数。
但是,大多数情况下,您将使用子查询或子查询分解子句,并在单个查询中完成所有操作(然后您不需要在SQL和PL/SQL之间进行上下文切换,或者更糟的是,从客户端应用程序执行多个语句并为每个语句产生网络请求的开销)。
fiddle

相关问题