2016-10-10 5 views
0

Ниже мой SQL-запрос, и я получаю ошибку при выполнении его как ORA-01427: однострочный подзапрос возвращает более одной строки.ORA-01427: однострочный подзапрос возвращает более одной строки SQL-запрос

Пожалуйста, помогите с работой вокруг:

SELECT * 
FROM TableName err 
WHERE ERR.SYSCD IN 
     (decode(REGEXP_COUNT('TEST1,TEST2', ','), 0, 'TEST3', 
       (SELECT DISTINCT syscd 
       FROM TableName 
       WHERE syscd IN 
        (SELECT err.syscd 
         FROM TableName ERR 
         WHERE ERR.SYSCD NOT IN 
          (SELECT UPPER(
             REGEXP_SUBSTR(
              'TEST1', 
              '[^,]+', 
              1, 
              LEVEL)) 
           CNTRY_CD 
          FROM DUAL 
          CONNECT BY REGEXP_SUBSTR(
              'TEST1', 
              '[^,]+', 
              1, 
              LEVEL) 
             IS NOT NULL) 
        ) 
        OR syscd IS NULL))) 
+3

Ошибка само за себя: один из подзапросов возвращается более одной строки. Вы лучше всего можете проверить свою бизнес-логику и изменить запрос. –

+1

@TimBiegeleisen правильный (сам пояснительная записка). Я бы добавил в качестве бонуса следующее: Вы уверены, что хотите иметь REGEXP в столбцах исходной таблицы? Если таблица (таблицы) мала, то она должна быть в порядке. В противном случае вы вызываете полное сканирование в таблице (таблицах). – FDavidov

+1

Если бы я был игроком ставок, я бы сказал, что подзапрос SELECT DISTINCT syscd' является виновником, так как это единственный, который я вижу, в котором вам нужен результат одной строки. Чтобы помочь вам исправить это, вам нужно будет объяснить, что вы хотите. – Deltharis

ответ

0

Сво просто заблуждение. Вот как decode работы:

select decode(a, 'a', 'AA', 'b','BB', '??') from (
      select 'a' a from dual 
union all select 'b' a from dual 
union all select 'c' a from dual 
); 

дает

AA 
BB 
?? 

Это происходит потому, что каждый операнд в decode одно значение. Но в вашем запросе, очевидно, что ваш

SELECT DISTINCT syscd 
      FROM TableName 
      WHERE syscd IN (<some values set>) 
       OR syscd IS NULL 

возвращает более одной строки. Таким образом, чтобы решить эту проблему, вы должны убедиться, есть только одна строка с WHERE rownum=1:

SELECT * 
FROM TableName err 
WHERE ERR.SYSCD IN 
     (decode(REGEXP_COUNT('TEST1,TEST2', ','), 0, 'TEST3', 
       select val from (SELECT DISTINCT syscd val 
       FROM TableName 
       WHERE syscd IN 
        (SELECT err.syscd 
         FROM TableName ERR 
         WHERE ERR.SYSCD NOT IN 
          (SELECT UPPER(
             REGEXP_SUBSTR(
              'TEST1', 
              '[^,]+', 
              1, 
              LEVEL)) 
           CNTRY_CD 
          FROM DUAL 
          CONNECT BY REGEXP_SUBSTR(
              'TEST1', 
              '[^,]+', 
              1, 
              LEVEL) 
             IS NOT NULL) 
        ) 
        OR syscd IS NULL) where rownum=1)) 

Будьте осторожны, потому что это не может делать то, что вы ожидаете. Он принимает только одно значение из подвыборки, но не уверен, что это то, что вы ожидаете.

EDIT

Это не имеет никакого смысла делать выше для вас. То, что вы хотите, имеет либо syscd в <one set>, либо, возможно, в других значениях вашего декодирования. Поэтому сделайте между ними union; Здесь:

SELECT * 
FROM TableName err 
WHERE ERR.SYSCD IN (
       select decode(REGEXP_COUNT('TEST1,TEST2', ','), 0, 'TEST3') 
       from dual 
     union 
       SELECT DISTINCT syscd 
       FROM TableName 
       WHERE syscd IN 
        (SELECT err.syscd 
         FROM TableName ERR 
         WHERE ERR.SYSCD NOT IN 
          (SELECT UPPER(
             REGEXP_SUBSTR(
              'TEST1', 
              '[^,]+', 
              1, 
              LEVEL)) 
           CNTRY_CD 
          FROM DUAL 
          CONNECT BY REGEXP_SUBSTR(
              'TEST1', 
              '[^,]+', 
              1, 
              LEVEL) 
             IS NOT NULL) 
        ) 
        OR syscd IS NULL) 

... но она до сих пор не имеет особого смысла ...

Смежные вопросы