tags:

views:

931

answers:

4

Hi,

I want to return multiple values from a query in oracle. For ex:

select count(*)
from tablename a 
where asofdate='10-nov-2009'
and a.FILENAME in (case 
    when 1 = 1 then (select distinct filename from tablename 
        where asofdate='10-nov-2009' and isin is null) 
    else null
end);

I am getting error: ora 01427 single row subquery returns more than one row

Please advice.

Thanks, Deepak

A: 

Run this query:

select distinct filename from tablename 
where asofdate='10-nov-2009' and isin is null

You'll see that it returns more than a single row which causes the ORA-01427.

Aaron Digulla
+2  A: 

A CASE statement cannot return more than one value, it is a function working on one value.

It is not required for your statement, this statement should work:

select count(*) 
from tablename a 
where asofdate='10-nov-2009' 
and a.FILENAME in (select distinct filename 
    from tablename 
    where asofdate='10-nov-2009'
    and isin is null);

Maybe you have another usage scenario in mind? Something like this: Select * From aTable Where in CASE WHEN Then WHEN Then ELSE END

Then using CASE may not be the right scenario. Maybe this helps you in the right direction:

Select *
From aTable
Where <Case1> and  column1 in <Subselect1>
Or <Case2> and column1 in <Subselect2>
OR Not (<Case1> Or <Case2>) and column1 in <Subselect3>

But this will probably be quite some work for the optimizer ...

IronGoofy
Thanks Iron.yes you are right.i am using case statement for 2 conditions like if todays_data = Monthend_date use filenames which lb_% else use filenames like returns_%.There are more than 1 filenames in the table. Thanks again
Deepak
+3  A: 

The distinct in your Case statement is attempting to return multiple values when only one is allowed, and your SELECT statement will only return one value in one row currently. If you're trying to get the count of each filename, do

SELECT FileName, Count(*)
FROM tablename
WHERE asofdate='10-nov-2009' and isin is null
GROUP BY FileName
CodeByMoonlight
A: 

For all I can tell, you're looking for something like:

select a.filename, count(*)
from tablename a
where a.asofdate = '10-nov-2009' 
and exists (
    select *
    from tablename b
    where b.isin is null
    and a.asofdate = '10-nov-2009' 
    and a.filename = b.filename
)
group by a.filename

This would find the count of filenames for a day, for which there exists at least one row where isin is null.

If you edit your question and add an explanation of what you're looking for, you might get better answers.

Andomar