I was always afraid to ask, but probably you can tell me:
what is the best way to count distinct tuples ?
Why does just
select count(distinct a, b) from
(
select 1 a, 1 b, 1 c from dual union all
select 1 a, 1 b, 2 c from dual union all
select 2 a, 3 b, 4 c from dual
)
/
gives
ORA-00909: invalid number of arguments
and
select count(distinct (a, b)) from
(
select 1 a, 1 b, 1 c from dual union all
select 1 a, 1 b, 2 c from dual union all
select 2 a, 3 b, 4 c from dual
)
/
gives
ORA-00907: missing right parenthesis,
instead we have to use
select count(*) from
(
select distinct a, b
from
(
select 1 a, 1 b, 1 c from dual union all
select 1 a, 1 b, 2 c from dual union all
select 2 a, 3 b, 4 c from dual
)
)
/
COUNT(*)
----------
2
?
Should we better use something else for example
select max(rownum) from
(
select a,b
from
(
select 1 a, 1 b, 1 c from dual union all
select 1 a, 1 b, 2 c from dual union all
select 2 a, 3 b, 4 c from dual
)
group by a, b
)
/
MAX(ROWNUM)
-----------
2
?
Well:
select count(*) from
(
select distinct a, b
from
(
select 1 a, 1 b, 1 c from dual union all
select 1 a, 1 b, 2 c from dual union all
select 2 a, 3 b, 4 c from dual
)
)
Is the most obvious as to your intent. There are many other ways you could write this, like:
select count(*) from (
select row_number() over (partition by a, b order by a) rn
from
(
select 1 a, 1 b, 1 c from dual union all
select 1 a, 1 b, 2 c from dual union all
select 2 a, 3 b, 4 c from dual
)
)
where rn = 1;
COUNT(*)
2
But these all make it harder for anyone looking at your code to figure out what it's doing. I'd stick with the "select count(*) from (select distinct ..." method.