Oracle 单行子查询使用嵌套的selects和substr返回多行更新

Oracle 单行子查询使用嵌套的selects和substr返回多行更新,oracle,select,nested,subquery,substring,Oracle,Select,Nested,Subquery,Substring,我正试图为一个表编写一个查询,该表需要根据某些参数更新某些记录。我有几个嵌套的select和几个嵌套的子字符串,我想这是我很难排除故障的原因。我解决了ORA-01427中的几个问题:单行子查询已经返回了多行问题,但我似乎找不到这个问题。从本质上讲,脚本所做的是从一个记录中获取两列,并根据不同表中包含的另一个记录,基于许多不同的条件对其进行更新。以下是我正在使用的当前代码: UPDATE CMC_SBEL_ELIG_ENT p SET (p.CSPI_ID, p.SBEL_EFF_DT) = (S

我正试图为一个表编写一个查询,该表需要根据某些参数更新某些记录。我有几个嵌套的select和几个嵌套的子字符串,我想这是我很难排除故障的原因。我解决了ORA-01427中的几个问题:单行子查询已经返回了多行问题,但我似乎找不到这个问题。从本质上讲,脚本所做的是从一个记录中获取两列,并根据不同表中包含的另一个记录,基于许多不同的条件对其进行更新。以下是我正在使用的当前代码:

UPDATE CMC_SBEL_ELIG_ENT p
SET (p.CSPI_ID, p.SBEL_EFF_DT) =
(SELECT co.new_plan, co.ch_dt
   FROM sbsb_plan_conv co, cmc_sbel_elig_ent p
   WHERE co.ch_dt > p.sbel_eff_dt
     and co.ch_dt < current_date
     AND co.new_plan <> p.CSPI_ID
     AND co.sbsb_ck = p.sbsb_ck
     AND p.cspi_id IN co.OLD_PLAN
     and p.SBEL_ELIG_TYPE IN ('tm','ce','TM','CE')
     )
WHERE (p.cspd_cat IN (
   select unique substr(o.old_plan, 1, 1) 
      from facets_ws.sbsb_plan_conv o
      where 
        substr(o.old_plan, 1, 1) IN (
            select substr(y.new_plan, 1, 1)   
            from sbsb_plan_conv y, cmc_sbel_elig_ent u
            where y.sbsb_ck = u.sbsb_ck
              AND (p.SBEL_ELIG_TYPE IN ('tm','ce','TM','CE'))

              and ((substr(y.new_plan, 1, 1) = 'M'
                and substr(y.new_plan, 1, 1) != 'R'
                and substr(y.new_plan, 1, 1) != 'D') 

                or (substr(y.new_plan, 1, 1) = 'R'
                and substr(y.new_plan, 1, 1) != 'M'
                and substr(y.new_plan, 1, 1) != 'D')

                or (substr(y.new_plan, 1, 1) = 'D'
                and substr(y.new_plan, 1, 1) != 'R'
                and substr(y.new_plan, 1, 1) != 'M'))

            and o.sbsb_ck = p.sbsb_ck)
      )
  );

现在,当我对两个select语句运行单独的查询时,它们都返回明确的唯一值。因此,我相当肯定它们不是问题所在。

尝试执行以下查询:-

SELECT count(co.new_plan)
  FROM sbsb_plan_conv co, cmc_sbel_elig_ent p
WHERE co.ch_dt > p.sbel_eff_dt
 and co.ch_dt < current_date
 AND co.new_plan <> p.CSPI_ID
 AND co.sbsb_ck = p.sbsb_ck
 AND p.cspi_id IN co.OLD_PLAN
 and p.SBEL_ELIG_TYPE IN ('tm','ce','TM','CE')
 group by co.new_plan;

如果上面返回的行数多于一行,或者返回的计数多于一行,那么您可能需要将查询更改为执行DISTINCT/MIN/use ROWNUM或其他技术。

您的第一个子查询肯定会返回多行。请改用合并。