Однострочный подзапрос возвращает более одной строки с несколькими операциями ИЛИ

Я получил эту ошибку при использовании нескольких зацикленных ИЛИ: однострочный подзапрос возвращает более одной строки,

Ошибка возникает только через почтальона (возможно, связанного с спящим режимом), запрос работает в oracle sql develoer

Мой запрос :


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 develper, но не в коде Java с спящим режимом?

Вы должны предоставить код для воспроизведения ошибки. Пожалуйста, прочитайте stackoverflow.com/help/how-to-ask

aled 19.04.2023 20:50

это не имеет ничего общего с почтальоном.

OldProgrammer 19.04.2023 21:08

Пожалуйста, укажите ошибку! Мы не сможем помочь, если вы не покажете нам, что происходит, когда вы запускаете свой код.

Ben the Coder 23.04.2023 23:14
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
53
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
        )

Другие вопросы по теме