在oracle中迭代一组varchar2的select查询

在oracle中迭代一组varchar2的select查询,oracle,loops,Oracle,Loops,我有一个下面选择的查询 select * from BUSINESS_T where store_code = '075' and item_no in ( select item_no from BUSINESS_T a where store_code = '075' and exists ( select * from BUSINESS_T

我有一个下面选择的查询

    select * from BUSINESS_T
where  store_code = '075'
and item_no in
(
         select item_no from BUSINESS_T a
         where store_code = '075'
         and exists
         (
                  select * from BUSINESS_T
                  where store_code = a.store_code 
                  and item_no = a.item_no
                  and
                  (
                            VALID_FROM_DTIME between a.VALID_FROM_DTIME and a.VALID_TO_DTIME
                            or VALID_TO_DTIME between a.VALID_FROM_DTIME and a.VALID_TO_DTIME
                            or (VALID_FROM_DTIME > a.VALID_FROM_DTIME and a.VALID_TO_DTIME is null)
                            or (VALID_FROM_DTIME < a.VALID_FROM_DTIME and VALID_TO_DTIME is null)
                  )
                  and del_dtime is null
                  and not
                  (
                            a.rowid = rowid
                  )
         )
)
order by item_no, VALID_FROM_DTIME
需要为存储编号{'071'、'072'、'073'、'074'、'075'、'076'的数组运行它} 这个数组应该在查询本身内部定义


那里有近400多家固定门店。必须对每个门店一次对一个门店运行上述查询,以查找该特定门店中的重叠部分

用于:

对于这个特定的字符串值序列,我们可以尝试使用正则表达式来缩短谓词,尽管这可能效率较低:

regexp_like(class_unit_code, '^07[1-6]$')
或者,如果字符串始终包含数值,我们可以转换并使用范围比较,这也不如第一个选项有效-在这种情况下,应使用数字数据类型创建列,以:

to_number(class_unit_code) between 71 and 76
用于:

对于这个特定的字符串值序列,我们可以尝试使用正则表达式来缩短谓词,尽管这可能效率较低:

regexp_like(class_unit_code, '^07[1-6]$')
或者,如果字符串始终包含数值,我们可以转换并使用范围比较,这也不如第一个选项有效-在这种情况下,应使用数字数据类型创建列,以:

to_number(class_unit_code) between 71 and 76

如果我通过传递商店编号集合来运行,则许多商店中常见的商品可能会导致问题

如果修改第一个子查询以获取返回存储/项目对,则仍然可以使用,该子查询将处理常见项目:

select * from BUSINESS_T
where (store_code, item_no) in
(
         select store_code, item_no from BUSINESS_T a
         where store_code in ('071','072','073','074','075','076')
...
或与收藏一起:

select * from BUSINESS_T
where (store_code, item_no) in
(
         select store_code, item_no from BUSINESS_T a
         where store_code member of sys.dbms_debug_vc2coll('071','072','073','074','075','076')
...
这是一个非常简单的想法演示


如果我通过传递商店编号集合来运行,则许多商店中常见的商品可能会导致问题

如果修改第一个子查询以获取返回存储/项目对,则仍然可以使用,该子查询将处理常见项目:

select * from BUSINESS_T
where (store_code, item_no) in
(
         select store_code, item_no from BUSINESS_T a
         where store_code in ('071','072','073','074','075','076')
...
或与收藏一起:

select * from BUSINESS_T
where (store_code, item_no) in
(
         select store_code, item_no from BUSINESS_T a
         where store_code member of sys.dbms_debug_vc2coll('071','072','073','074','075','076')
...

非常简单的想法演示。

您的门店号在哪里?从哪里到外面传递,以及如何传递?请编辑您的问题,以包括执行此SQL的代码,并显示调用者如何拥有这些数字,例如在本机数组中。您可能希望传入一组值,但应用程序类型/语言将确定这是否可行以及应该如何实现。根据您对GMB答案的评论,此查询只是您尝试执行的一小部分,因此也请清楚解释,以及在何处/何时使用多个值。必须为每个门店运行查询-作为一个组合结果集?如果是这样的话,为什么你不能在收藏中使用,或者,最好还是传递一个收藏。或者,您的应用程序是否需要针对其拥有的每个站点ID逐个运行它?如果我通过传递门店编号集合来运行,则许多门店中常见的商品很可能会导致问题。查询本身必须从数组中读取存储编号,并为该存储运行select查询。此查询必须由支持人员使用sql developer运行,而不是通过任何代码或过程运行。您的存储编号在哪里?从何处传递,以及如何传递?请编辑您的问题,以包括执行此SQL的代码,并显示调用者如何拥有这些数字,例如在本机数组中。您可能希望传入一组值,但应用程序类型/语言将确定这是否可行以及应该如何实现。根据您对GMB答案的评论,此查询只是您尝试执行的一小部分,因此也请清楚解释,以及在何处/何时使用多个值。必须为每个门店运行查询-作为一个组合结果集?如果是这样的话,为什么你不能在收藏中使用,或者,最好还是传递一个收藏。或者,您的应用程序是否需要针对其拥有的每个站点ID逐个运行它?如果我通过传递门店编号集合来运行,则许多门店中常见的商品很可能会导致问题。查询本身必须从数组中读取存储编号,并为该存储运行select查询。此查询必须由支持人员使用sql developer运行,而不是通过任何代码或过程运行。此时,我只需传递一个存储编号。这让我无法使用IN运算符。这是一个非常大的内部查询,3个select中有1个在另一个中。这个select的主要用途是查找特定商店中的重叠项。我用完整的重叠查询更新了问题,一次只需传递一个商店编号。这让我无法使用IN运算符。这是一个非常大的内部查询,3个select中有1个在另一个中。这一选择的主要用途是查找特定存储中的重叠项。我现在使用完整的重叠查询更新了问题,您的答案存储代码为'071'、'072'、'073'、'074'、'075'、'076',我需要从同一个表中获取存储代码。选择从业务中分离存储代码,但查询太耗时,无法给出响应。不确定您的意思。您只想知道该列表中的哪些代码存在于表中?你可能应该问一个新问题来表达你的疑问,d
ata卷、预期输出等。但您可能正在查找存在的条件。在上面的工作查询中,我硬编码了store_代码,我需要通过查询select distinctstore_code from BUSINESS_T从同一个表中获取,在增强此响应时间后,会增加响应时间。选择*from BUSINESS_T where store_code,选择门店代码中的物料编号,业务中的物料编号,选择区门店代码中的门店代码,业务中的物料编号_T@Gangs165700-针对同一个表的三个查询级别实际上没有意义,但我认为可以简化为一个带有exists子句的主查询来检查日期范围。你最初说ID是从外面传进来的。这个问题已经回答了。作为一个新问题,请解释您面临的新情况和问题。在上面的回答中,我需要从同一个表中获取存储单元代码“071”、“072”、“073”、“074”、“075”、“076”。选择从业务中分离存储代码,但查询太耗时,无法给出响应。不确定您的意思。您只想知道该列表中的哪些代码存在于表中?您可能应该问一个新问题,显示您的查询、数据量、预期输出等。但您可能正在查找存在的条件。在上面的工作查询中,我硬编码了store_代码,我需要通过查询BUSINESS_T中的select distinctstore_代码从同一个表中获取该代码,增强后,此响应时间会增加。选择*来自业务\u T存储位置\u代码,选择存储位置\u代码中的项目\u编号,来自业务\u T的项目\u编号来自业务\u T,选择区存储位置\u代码_T@Gangs165700-针对同一个表的三个查询级别对此没有实际意义,但是我认为您可以简化为一个带有exists子句的主查询来检查日期范围。你最初说ID是从外面传进来的。这个问题已经回答了。请以新问题的形式解释您面临的新情况和新问题。