Обсуждение: self outer join

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

self outer join

От
David Link
Дата:
Hi,

In pg 7.1 using the new outer join syntax.

  SELECT *
  FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);

or

  SELECT *
  FROM t1 LEFT OUTER JOIN t2 USING (col);

How does one specify an alias for the table being joined.  This is
important if you are creating an outer join to the same table:

Oracle syntax (simplified) would be:

select r.key,
       r.rank,
       r2.rank as last_weeks_rank
from   rank r,
       rank r2
where  r.key = (+)r2.key and
       r2.week = r1.week - 1
;


This is quite painful to do using the older outer join technique with
the UNION ALL ... (unless someone can do this better):

select t.upckey, r.rank, r2.rank as last_weeks_ranking
from   title t,
       rank r,
       rank r2
where  r.upckey = t.upckey and
       r2.upckey = t.upckey and
       r.week = 200102 and
       r2.week = r.week-1 and
       r.media = 'M' and
       r2.media = 'M'
UNION ALL
select t.upckey, r.rank, null as last_weeks_ranking
from   title t,
       rank r
where  r.upckey = t.upckey and
       r.week = 200102 and
       r.media = 'M' and
       not exists (select r2.week
                   from   rank r2
                   where  r2.upckey = t.upckey and
                          r2.week = r.week - 1 and
                          r2.media = 'M')
order by
     r.rank
;


Phewy.  If that's it, then I'll do it programmatically with cursors.

Thanks for any and all help on this
-David

Re: self outer join

От
Stephan Szabo
Дата:
On Tue, 6 Nov 2001, David Link wrote:

> Hi,
>
> In pg 7.1 using the new outer join syntax.
>
>   SELECT *
>   FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
>
> or
>
>   SELECT *
>   FROM t1 LEFT OUTER JOIN t2 USING (col);
>
> How does one specify an alias for the table being joined.  This is
> important if you are creating an outer join to the same table:
>
> Oracle syntax (simplified) would be:
>
> select r.key,
>        r.rank,
>        r2.rank as last_weeks_rank
> from   rank r,
>        rank r2
> where  r.key = (+)r2.key and
>        r2.week = r1.week - 1
> ;

I think  (untested)
select r.key, r.rank, r2.rank as last_weeks_rank
 from (rank r left outer join rank r2 using (key))
 where r2.week=r1week-1;


Re: self outer join

От
Jeff Eckermann
Дата:
Same way as you would alias any table in your FROM
clause, i.e.:
FROM table AS t1 LEFT OUTER JOIN table AS t2
     ON t1.field = t2.field
The AS keyword is optional here, but I think preferred
for clarity.

--- David Link <dlink@soundscan.com> wrote:

> How does one specify an alias for the table being
> joined.  This is
> important if you are creating an outer join to the
> same table:


__________________________________________________
Do You Yahoo!?
Find a job, post your resume.
http://careers.yahoo.com

Re: self outer join

От
Peter Eisentraut
Дата:
David Link writes:

> How does one specify an alias for the table being joined.

select * from t1 as a left outer join t1 as b using (a.col1 = b.col2);

--
Peter Eisentraut   peter_e@gmx.net


Re: self outer join

От
"John D. Rozeboom"
Дата:
Try:

SELECT *
FROM Table t1
    JOIN Table t2 ON t1.col = t2.col

"David Link" <dlink@soundscan.com> wrote in message
news:3BE7F948.93E656D3@soundscan.com...
> Hi,
>
> In pg 7.1 using the new outer join syntax.
>
>   SELECT *
>   FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
>
> or
>
>   SELECT *
>   FROM t1 LEFT OUTER JOIN t2 USING (col);
>
> How does one specify an alias for the table being joined.  This is
> important if you are creating an outer join to the same table:
>
> Oracle syntax (simplified) would be:
>
> select r.key,
>        r.rank,
>        r2.rank as last_weeks_rank
> from   rank r,
>        rank r2
> where  r.key = (+)r2.key and
>        r2.week = r1.week - 1
> ;
>
>
> This is quite painful to do using the older outer join technique with
> the UNION ALL ... (unless someone can do this better):
>
> select t.upckey, r.rank, r2.rank as last_weeks_ranking
> from   title t,
>        rank r,
>        rank r2
> where  r.upckey = t.upckey and
>        r2.upckey = t.upckey and
>        r.week = 200102 and
>        r2.week = r.week-1 and
>        r.media = 'M' and
>        r2.media = 'M'
> UNION ALL
> select t.upckey, r.rank, null as last_weeks_ranking
> from   title t,
>        rank r
> where  r.upckey = t.upckey and
>        r.week = 200102 and
>        r.media = 'M' and
>        not exists (select r2.week
>                    from   rank r2
>                    where  r2.upckey = t.upckey and
>                           r2.week = r.week - 1 and
>                           r2.media = 'M')
> order by
>      r.rank
> ;
>
>
> Phewy.  If that's it, then I'll do it programmatically with cursors.
>
> Thanks for any and all help on this
> -David
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
> http://archives.postgresql.org