подзапрос возвращает более одной строки - decode - where предложение - Oracle - PullRequest
0 голосов
/ 08 апреля 2020
SELECT *
FROM acr_cash_receipts_v acr
WHERE 1 = 1
      AND acr.receipt_date BETWEEN '01-JAN-19' AND '31-JAN-19'
      AND acr.currency_code IN 
        DECODE( 'NOINR', 'NOINR', ( SELECT currency_code
                                    FROM fnd_currencies
                                    WHERE currency_code <> 'INR'
                                  ),
                          acr.currency_code);

в предложении where - декодировать мне нужно использовать предложение select, чтобы получить все валюты

Спасибо

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Ваш запрос можно переформатировать, избегая использования DECODE для достижения желаемого результата следующим образом:

SELECT *
FROM acr_cash_receipts_v acr
WHERE 1 = 1
      AND acr.receipt_date BETWEEN '01-JAN-19' AND '31-JAN-19'
      AND (acr.currency_code = 'NOINR' 
          OR acr.currency_code IN 
             ( SELECT currency_code
                 FROM fnd_currencies
                WHERE currency_code <> 'INR'));
0 голосов
/ 08 апреля 2020

Первое, что я вижу, это то, что условие WHERE 1=1 не нужно.

Следующим является то, что DECODE('NOINR','NOINR', (SELECT CURRENCY_CODE FROM FND_CURRENCIES WHERE CURRENCY_CODE <> 'INR', ACR.CURRENCY_CODE); может возвращать несколько строк (выбирается значение из подзапроса).

Вероятно, ЭТО возвращает более одного результата:

SELECT CURRENCY_CODE FROM FND_CURRENCIES WHERE CURRENCY_CODE <> 'INR', ACR.CURRENCY_CODE

Вероятно, имеется более одного CURRENCY_CODE, который НЕ РАВЕН * 'INR'

Кроме того, не могли бы вы попробовать этот запрос и посмотреть, выполняет ли он то же самое?

select * from acr_cash_receipts_v acr where acr.receipt_date between '01-JAN-19' AND '31-JAN-19' and acr.currency_code in DECODE('NOINR','NOINR', (SELECT CURRENCY_CODE FROM FND_CURRENCIES WHERE CURRENCY_CODE <> 'INR'), ACR.CURRENCY_CODE);

Я изменил расположение круглой скобки ЗАКРЫТИЕ после 'INR', потому что это кажется неправильно сформированным подвыбором.

Вы также можете запустить подзапрос непосредственно, чтобы увидеть, возвращаются ли несколько строк:

SELECT CURRENCY_CODE FROM FND_CURRENCIES WHERE CURRENCY_CODE <> 'INR'

Без базы данных / образца я не могу выполнить этот запрос самостоятельно.

...