Thread: ANSI join types

ANSI join types

From
Bruce Momjian
Date:
I got this list from Gavin Roy's presentation at O'Reilly.  Is there a
good spot for this summary?

Also, I can not find documentation on UNION JOINS in our docs.

---------------------------------------------------------------------------

Bruce Momjian wrote:
>    SELECT
>      * JOINS
>
>      * Cross: All combinations of rows are used
>      * Inner: Only rows where matches are found are retained
>      * Left (Outer): Returns all rows from table A, matched or not, and
>        only rows from table B where matches are found
>      * Right (Outer): Inverse of Left, returns all rows from table B and
>        only matches from table A
>      * Full: A combination of left and right.  Where matches are not
>        found, NULLs fill the columns of the other table
>      * Union: This is different than the UNION operator used to merge the
>        output of multiple queries.  This is the inverse of an Inner, only
>        rows are returned when no matches are found
>
> --
>   Bruce Momjian                        |  http://candle.pha.pa.us
>   pgman@candle.pha.pa.us               |  (610) 853-3000
>   +  If your life is a hard drive,     |  830 Blythe Avenue
>   +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: ANSI join types

From
Tom Lane
Date:
Bruce Momjian <pgman@candle.pha.pa.us> writes:
> Also, I can not find documentation on UNION JOINS in our docs.

There is none because we don't support it.  While I took the trouble
to make the parser take it, there's no implementation.  I'm not now
excited about making it happen ever, because I read this in SQL99:

                                       Annex D
                                 Deprecated features

         It is intended that the following features will be removed at a
         later date from a revised version of this part of ISO/IEC 9075:

         1) The ability to specify UNION JOIN in a <joined table> has been
            deprecated.

BTW, I think the description

>      * Union: This is different than the UNION operator used to merge the
>        output of multiple queries.  This is the inverse of an Inner, only
>        rows are returned when no matches are found

is pretty poor.  As near as I can tell from the SQL92 spec, "x UNION
JOIN y" is supposed to produce the same result as

    (select *,<y.nulls> from x) UNION ALL (select <x.nulls>,* from y)

where <y.nulls> denotes a list of NULLs matching the columnset of y,
and similarly for <x.nulls>.  This behavior has nothing to do with
whether any value matches exist between x and y --- it makes no join
comparisons at all.

            regards, tom lane