Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Usenet -> c.d.o.tools -> Re: Union All Problem
First you haven't created your view
with the statement you give us.
Actually, in your create view statement
view keyword is missing and there is 4
columns for the view and only 3 in the
select statements.
If you correct that, it's important to
know your Oracle version.
That works fine in Oracle 7.3.4, with
union or union all:
v734> create table tablea (col1 number,colx number); v734> create table tableb (col2 number, col3 number); v734> create or replace view my_view (col1,col2,col3) as2 select a.col1,b.col2,b.col3
5 , col3 6 from tableb) b
12 , col3 13 from tableb) b
no rows selected
v734> select * from my_view;
no rows selected
v734> create or replace view my_view (col1,col2,col3) as
2 select a.col1,b.col2,b.col3
3 from tablea a
4 , (select col2
5 , col3 6 from tableb) b
12 , col3 13 from tableb) b
v734> select 1, 2 from my_view;
no rows selected
v734> select * from my_view;
no rows selected
But you're right in 8.1.5:
v815> create table tablea (col1 number,colx number); v815> create table tableb (col2 number, col3 number); v815> create or replace view my_view (col1,col2,col3) as2 select a.col1,b.col2,b.col3
5 , col3 6 from tableb) b
12 , col3 13 from tableb) b
*
v815> select * from my_view;
no rows selected
v815> create or replace view my_view (col1,col2,col3) as
2 select a.col1,b.col2,b.col3
3 from tablea a
4 , (select col2
5 , col3 6 from tableb) b
12 , col3 13 from tableb) b
v815> select 1, 2 from my_view;
no rows selected
v815> select * from my_view;
no rows selected
The difference between union and union all is the deletion of the duplicated rows with the union.
Here's the two explain plans for
"select * from my_view;"
first with union all and then with union.
SELECT STATEMENT
VIEW MY_VIEW
UNION-ALL
MERGE JOIN SORT JOIN TABLE ACCESS FULL TABLEB SORT JOIN TABLE ACCESS FULL TABLEA MERGE JOIN SORT JOIN TABLE ACCESS FULL TABLEB SORT JOIN TABLE ACCESS FULL TABLEA
SELECT STATEMENT
VIEW MY_VIEW
SORT UNIQUE
UNION-ALL MERGE JOIN SORT JOIN TABLE ACCESS FULL TABLEB SORT JOIN TABLE ACCESS FULL TABLEA MERGE JOIN SORT JOIN TABLE ACCESS FULL TABLEB SORT JOIN TABLE ACCESS FULL TABLEA
You see the SORT UNIQUE step used for the deletion of the duplicates.
It is interesting to notice that the use of an inline view does not generate an error:
v815> select 1, 2 from
2 (select a.col1,b.col2,b.col3
3 from tablea a
4 , (select col2
5 , col3 6 from tableb) b
12 , col3 13 from tableb) b
no rows selected
So, it seems to be a bug.
-- Regards Michel Gareth Leachman <grleachman_at_my-deja.com> a écrit dans le message : 8fp5sa$dq9$1_at_nnrp1.deja.com...Received on Mon May 15 2000 - 00:00:00 CDT
> I would like to know if anyone has a documented reason for the
> following:
>
> select 1, 2 from my_view;
> select * from my_view;
>
> are 2 select queries on my_view.
> my_view defined as:
>
> create my_view (col1,col2,col3,col4) as
> select a.col1,b.col2,b.col3
> from tablea a
> , (select col2
> , col3
> from tableb) b
> where b.col3 = a.colx
> union all
> select a.col1,b.col2,b.col3
> from tablea a
> , (select col2
> , col3
> from tableb) b
> where b.col3 = a.colx
>
> Now when the first query is run it gives error 1789: Query block has
> incorrect number of result columns.
> The second query returns a correct result.
>
> After doing a little bit of fiddling, the inline view was taken out, and
> this produced a proper result for query 1.
>
> It was interesting to note that replacing union all with union worked
> for query 1 and 2 in the original version.
>
> So the question is: why would an inline view affect the result of a
> union all query.
>
> Thanks
> Gareth
>
>
> Sent via Deja.com http://www.deja.com/
> Before you buy.
![]() |
![]() |