oracle 单行子查询返回多个具有多个OR的行

pinkon5k  于 2023-04-20  发布在  Oracle
关注(0)|答案(1)|浏览(195)

我在使用多个循环OR时遇到此错误:单行子查询返回多行,
该错误仅通过Postman发生(可能与Hibernate有关),查询在Oracle SQL Developer中工作
我的要求:

WITH SPRM_TABLE AS (
  SELECT 
    DISTINCT P.SPRM_KEY, 
    P.SPRM_PARENT_KEY AS PARENTS, 
    P.CPRM_KEY, 
    P.SPRM_PARENT_KEY 
  FROM 
    S4C_SUB_PERIMETER P 
    INNER JOIN S4C_CRITERIA CRI ON CRI.SPRM_KEY = P.SPRM_KEY 
  WHERE 
    (
      (
        CRI.CRI_TYPE = 'OFFER' 
        AND CRI.CRI_VALUE = 'BUSINESS_ETHERNET'
      )
    ) 
    or (
      (
        P.SPRM_PARENT_KEY IS NULL 
        OR (
          CRI.CRI_TYPE IN (
            'SATIN_ACCOUNT', 'SATIN_SUBACCOUNT', 
            'IDENT_RCE', 'ICO1'
          ) 
          AND (
            SELECT 
              CHP.CRI_KEY_PARENT 
            FROM 
              S4C_CRITERIA_HERITANCE CHP 
            WHERE 
              CHP.CRI_KEY_CHILD = CRI.CRI_KEY
          ) IN (
            SELECT 
              CBB.CRI_KEY 
            FROM 
              S4C_CRITERIA CBB 
            WHERE 
              CBB.SPRM_KEY = P.SPRM_PARENT_KEY
          )
        )
      ) 
      AND (
        (
          CRI.CRI_TYPE = 'IDENT' 
          AND CRI.CRI_VALUE = '00010525'
        )
      )
    )
) 
SELECT 
  DISTINCT CPRM.CPRM_KEY AS PRM_ID, 
  'CLIENT' AS PRM_TYPE 
FROM 
  CPRM_TABLE CPRM 
UNION ALL 
SELECT 
  DISTINCT PRM.SPRM_KEY AS PRM_ID, 
  'SUB' AS PRM_TYPE 
FROM 
  SPRM_TABLE PRM START WITH PRM.SPRM_PARENT_KEY IS NULL 
  AND PRM.CPRM_KEY IN (
    SELECT 
      CLI_PRM.CPRM_KEY 
    FROM 
      CPRM_TABLE CLI_PRM
  ) CONNECT BY PRIOR PRM.SPRM_KEY = PRM.SPRM_PARENT_KEY

如果有人可以帮助,请?如果有人可以解释为什么这在Oracle SQL开发人员中有效,而不是在Java代码中使用Hibernate?

rxztt3cl

rxztt3cl1#

你不能这样做:

AND (
            SELECT 
              CHP.CRI_KEY_PARENT 
            FROM 
              S4C_CRITERIA_HERITANCE CHP 
            WHERE 
              CHP.CRI_KEY_CHILD = CRI.CRI_KEY
          ) IN (
            SELECT 
              CBB.CRI_KEY 
            FROM 
              S4C_CRITERIA CBB 
            WHERE 
              CBB.SPRM_KEY = P.SPRM_PARENT_KEY
          )

IN运算符的左侧需要一个标量,而您提供的子查询显然返回多行。
您需要将这两个查询合并为一个:

AND EXISTS (
        SELECT *
          FROM S4C_CRITERIA_HERITANCE CHP ,
               S4C_CRITERIA CBB
         WHERE CHP.CRI_KEY_CHILD = CRI.CRI_KEY
           AND CBB.CRI_KEY = CHP.CRI_KEY_PARENT 
           AND CBB.SPRM_KEY = P.SPRM_PARENT_KEY
        )

相关问题