Обсуждение: Optional join

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

Optional join

От
"Slawek Jarosz"
Дата:
Hi,
 I trying to write a query that will join 2 tables.   Here's the concept:
Table 1: table1, primary key pk1
Table 2: table2, primary key pk2

One of the fields (f2) in table2 contains either the primary key of table1 or a NULL value.  So normally a pretty basic
query:

SELECT table1.*, table2.pk2 FROM table1, table2 WHERE table2.f2 = table1.pk1;

BUT what I would like to do is show all records of Table 1 even if there is no match in Table 2.  Meaning that the
reultscould be  
table1...   table2.pk2
table1...   NULL

Doable?

Thanks.



Re: Optional join

От
Bruno Wolff III
Дата:
On Thu, Aug 14, 2003 at 10:40:02 -0400, Slawek Jarosz <Jarosz.S@ems-t.ca> wrote:
> Hi,
> 
>   I trying to write a query that will join 2 tables.   Here's the concept:
> Table 1: table1, primary key pk1
> Table 2: table2, primary key pk2
> 
> One of the fields (f2) in table2 contains either the primary key of table1 or a NULL value.  So normally a pretty
basicquery:
 
> 
> SELECT table1.*, table2.pk2 FROM table1, table2 WHERE table2.f2 = table1.pk1;  
> 
> BUT what I would like to do is show all records of Table 1 even if there is no match in Table 2.  Meaning that the
reultscould be 
 
> table1...   table2.pk2
> table1...   NULL
> 
> Doable?

You use outer joins to do this. Something like:
SELECT table1.*, table2.pk2 FROM table1 left join table2 on table2.f2 = table1.pk1;


Re: Optional join

От
Stephan Szabo
Дата:
On Thu, 14 Aug 2003, Slawek Jarosz wrote:

> Hi,
>
>   I trying to write a query that will join 2 tables.   Here's the concept:

> Table 1: table1, primary key pk1 Table 2: table2, primary key pk2
>
> One of the fields (f2) in table2 contains either the primary key of
> table1 or a NULL value.  So normally a pretty basic query:
>
> SELECT table1.*, table2.pk2 FROM table1, table2 WHERE table2.f2 =
> table1.pk1;
>
> BUT what I would like to do is show all records of Table 1 even if
> there is no match in Table 2.  Meaning that the reults could be
> table1...   table2.pk2
> table1...   NULL

See outer joins.

Something like:
SELECT table1.*,table2.pk FROMtable1 LEFT OUTER JOIN table on (table2.f2=table1.pk1);



Re: Optional join

От
David Fetter
Дата:
"Slawek Jarosz" <Jarosz.S@ems-t.ca> wrote:
> Hi,

> I trying to write a query that will join 2 tables.   Here's the
> concept:

> Table 1: table1, primary key pk1
> Table 2: table2, primary key pk2

> One of the fields (f2) in table2 contains either the primary key of
> table1 or a NULL value.  So normally a pretty basic query:

> SELECT table1.*, table2.pk2
> FROM table1, table2 WHERE table2.f2 = table1.pk1;  

> BUT what I would like to do is show all records of Table 1 even if
> there is no match in Table 2.  Meaning that the reults could be 

> table1...   table2.pk2
> table1...   NULL

> Doable?

Yes.

SELECT table1.*, table2.pk2
FROM table1 LEFT OUTER JOIN table2 ON (table1.pk1 = table2.pk2);

HTH :)

Cheers,
D
-- 
David Fetter david@fetter.org http://fetter.org/
phone: +1 510 893 6100    cell: +1 415 235 3778

Power over a man's subsistence is power over his will.                                               Alexander
Hamilton


Re: Optional join

От
Ian Barwick
Дата:
On Thursday 14 August 2003 16:40, Slawek Jarosz wrote:
> Hi,
>
>   I trying to write a query that will join 2 tables.   Here's the concept:
> Table 1: table1, primary key pk1
> Table 2: table2, primary key pk2
>
> One of the fields (f2) in table2 contains either the primary key of table1
> or a NULL value.  So normally a pretty basic query:
>
> SELECT table1.*, table2.pk2 FROM table1, table2 WHERE table2.f2 =
> table1.pk1;
>
> BUT what I would like to do is show all records of Table 1 even if there is
> no match in Table 2.  Meaning that the reults could be table1...  
> table2.pk2
> table1...   NULL
>
> Doable?

You need an OUTER JOIN, see e.g.
http://www.postgresql.org/docs/7.3/static/tutorial-join.html

Ian Barwick
barwick@gmx.net