单行子查询返回多行,带有多个OR。

huangapple go评论102阅读模式
英文:

single-row subquery returns more than one row with multiple OR

问题

I got this error while using multiple looped OR : single-row subquery returns more than one row,

The error only occurs via postman (maybe related to hibernate), the query works in oracle sql develoer

My request :

  1. WITH SPRM_TABLE AS (
  2. SELECT
  3. DISTINCT P.SPRM_KEY,
  4. P.SPRM_PARENT_KEY AS PARENTS,
  5. P.CPRM_KEY,
  6. P.SPRM_PARENT_KEY
  7. FROM
  8. S4C_SUB_PERIMETER P
  9. INNER JOIN S4C_CRITERIA CRI ON CRI.SPRM_KEY = P.SPRM_KEY
  10. WHERE
  11. (
  12. (
  13. CRI.CRI_TYPE = 'OFFER'
  14. AND CRI.CRI_VALUE = 'BUSINESS_ETHERNET'
  15. )
  16. )
  17. or (
  18. (
  19. P.SPRM_PARENT_KEY IS NULL
  20. OR (
  21. CRI.CRI_TYPE IN (
  22. 'SATIN_ACCOUNT', 'SATIN_SUBACCOUNT',
  23. 'IDENT_RCE', 'ICO1'
  24. )
  25. AND (
  26. SELECT
  27. CHP.CRI_KEY_PARENT
  28. FROM
  29. S4C_CRITERIA_HERITANCE CHP
  30. WHERE
  31. CHP.CRI_KEY_CHILD = CRI.CRI_KEY
  32. ) IN (
  33. SELECT
  34. CBB.CRI_KEY
  35. FROM
  36. S4C_CRITERIA CBB
  37. WHERE
  38. CBB.SPRM_KEY = P.SPRM_PARENT_KEY
  39. )
  40. )
  41. )
  42. AND (
  43. (
  44. CRI.CRI_TYPE = 'IDENT'
  45. AND CRI.CRI_VALUE = '00010525'
  46. )
  47. )
  48. )
  49. )
  50. SELECT
  51. DISTINCT CPRM.CPRM_KEY AS PRM_ID,
  52. 'CLIENT' AS PRM_TYPE
  53. FROM
  54. CPRM_TABLE CPRM
  55. UNION ALL
  56. SELECT
  57. DISTINCT PRM.SPRM_KEY AS PRM_ID,
  58. 'SUB' AS PRM_TYPE
  59. FROM
  60. SPRM_TABLE PRM START WITH PRM.SPRM_PARENT_KEY IS NULL
  61. AND PRM.CPRM_KEY IN (
  62. SELECT
  63. CLI_PRM.CPRM_KEY
  64. FROM
  65. CPRM_TABLE CLI_PRM
  66. ) CONNECT BY PRIOR PRM.SPRM_KEY = PRM.SPRM_PARENT_KEY

If Someone could help please? and if someone could explain why does this works in Oracle sql develper but not in java code with hibernate?

英文:

I got this error while using multiple looped OR : single-row subquery returns more than one row,

The error only occurs via postman (maybe related to hibernate), the query works in oracle sql develoer

My request :

  1. WITH SPRM_TABLE AS (
  2. SELECT
  3. DISTINCT P.SPRM_KEY,
  4. P.SPRM_PARENT_KEY AS PARENTS,
  5. P.CPRM_KEY,
  6. P.SPRM_PARENT_KEY
  7. FROM
  8. S4C_SUB_PERIMETER P
  9. INNER JOIN S4C_CRITERIA CRI ON CRI.SPRM_KEY = P.SPRM_KEY
  10. WHERE
  11. (
  12. (
  13. CRI.CRI_TYPE = 'OFFER'
  14. AND CRI.CRI_VALUE = 'BUSINESS_ETHERNET'
  15. )
  16. )
  17. or (
  18. (
  19. P.SPRM_PARENT_KEY IS NULL
  20. OR (
  21. CRI.CRI_TYPE IN (
  22. 'SATIN_ACCOUNT', 'SATIN_SUBACCOUNT',
  23. 'IDENT_RCE', 'ICO1'
  24. )
  25. AND (
  26. SELECT
  27. CHP.CRI_KEY_PARENT
  28. FROM
  29. S4C_CRITERIA_HERITANCE CHP
  30. WHERE
  31. CHP.CRI_KEY_CHILD = CRI.CRI_KEY
  32. ) IN (
  33. SELECT
  34. CBB.CRI_KEY
  35. FROM
  36. S4C_CRITERIA CBB
  37. WHERE
  38. CBB.SPRM_KEY = P.SPRM_PARENT_KEY
  39. )
  40. )
  41. )
  42. AND (
  43. (
  44. CRI.CRI_TYPE = 'IDENT'
  45. AND CRI.CRI_VALUE = '00010525'
  46. )
  47. )
  48. )
  49. )
  50. SELECT
  51. DISTINCT CPRM.CPRM_KEY AS PRM_ID,
  52. 'CLIENT' AS PRM_TYPE
  53. FROM
  54. CPRM_TABLE CPRM
  55. UNION ALL
  56. SELECT
  57. DISTINCT PRM.SPRM_KEY AS PRM_ID,
  58. 'SUB' AS PRM_TYPE
  59. FROM
  60. SPRM_TABLE PRM START WITH PRM.SPRM_PARENT_KEY IS NULL
  61. AND PRM.CPRM_KEY IN (
  62. SELECT
  63. CLI_PRM.CPRM_KEY
  64. FROM
  65. CPRM_TABLE CLI_PRM
  66. ) CONNECT BY PRIOR PRM.SPRM_KEY = PRM.SPRM_PARENT_KEY

If Someone could help please? and if someone could explain why does this works in Oracle sql develper but not in java code with hibernate?

答案1

得分: 1

以下是您要翻译的内容:

"你不能这样做:

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
)"

英文:

You can't do this:

  1. AND (
  2. SELECT
  3. CHP.CRI_KEY_PARENT
  4. FROM
  5. S4C_CRITERIA_HERITANCE CHP
  6. WHERE
  7. CHP.CRI_KEY_CHILD = CRI.CRI_KEY
  8. ) IN (
  9. SELECT
  10. CBB.CRI_KEY
  11. FROM
  12. S4C_CRITERIA CBB
  13. WHERE
  14. CBB.SPRM_KEY = P.SPRM_PARENT_KEY
  15. )

The left side of the IN operator expects a scalar, and you are providing a subquery that is apparently returning multiple rows.

You will need to combine these two queries into one:

  1. AND EXISTS (
  2. SELECT *
  3. FROM S4C_CRITERIA_HERITANCE CHP ,
  4. S4C_CRITERIA CBB
  5. WHERE CHP.CRI_KEY_CHILD = CRI.CRI_KEY
  6. AND CBB.CRI_KEY = CHP.CRI_KEY_PARENT
  7. AND CBB.SPRM_KEY = P.SPRM_PARENT_KEY
  8. )

huangapple
  • 本文由 发表于 2023年4月20日 02:45:04
  • 转载请务必保留本文链接:https://go.coder-hub.com/76057884.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定