Обсуждение: set difference

Поиск
Список
Период
Сортировка

set difference

От
Domoszlai László
Дата:
Hello,

I would like to make symmetrical(set) difference in a query.
But the simpliest way I could find is

select id from a
except
select id from b
union
select id from b
except
select id from a

Is there any better solution for this problem?

Thanks
Laca





Re: set difference

От
Tom Lane
Дата:
Domoszlai László <dlacko@finit.hu> writes:
> I would like to make symmetrical(set) difference in a query.
> But the simpliest way I could find is 

> select id from a 
> except
> select id from b
> union 
> select id from b
> except
> select id from a

> Is there any better solution for this problem?

One thing you should definitely do is change "union" to "union all".
"union" implies a pass of duplicate removal, which shouldn't be
necessary here (unless a or b individually contain duplicates and
you want to get rid of those too).

Another thing to try is(a union b) except (a intersect b)
(Again, you might be able to say union all instead of union.)
Not sure which will be faster.
        regards, tom lane


Re: set difference

От
Domoszlai László
Дата:
Tom Lane wrote:
> > I would like to make symmetrical(set) difference in a query.
> > But the simpliest way I could find is
>
> > select id from a
> > except
> > select id from b
> > union
> > select id from b
> > except
> > select id from a
>
> > Is there any better solution for this problem?
>
> One thing you should definitely do is change "union" to "union all".
> "union" implies a pass of duplicate removal, which shouldn't be
> necessary here (unless a or b individually contain duplicates and
> you want to get rid of those too).
>
> Another thing to try is
>     (a union b) except (a intersect b)
> (Again, you might be able to say union all instead of union.)
> Not sure which will be faster.

It's likely faster but my problem is I have to run queries twice. I've looked at
setOp executor and it seems symmetrical differencial can run as time as an EXCEPT.
I would write it, because it speeds up my query very much, but I don't know if it is worth. So, do you think a
DIFFERENCEor EXCEPT SYMMETRIC clause will be reasonable  
feauture for postgresql?

Laca


Re: set difference

От
Tom Lane
Дата:
Domoszlai László <dlacko@finit.hu> writes:
> So, do you think a DIFFERENCE or EXCEPT SYMMETRIC clause will be reasonable 
> feauture for postgresql?

I doubt it; haven't heard a request for it before, and AFAICS there's no
such thing in the SQL spec...
        regards, tom lane