Re: Wacky query plan, why?

Поиск
Список
Период
Сортировка
От Mike Mascari
Тема Re: Wacky query plan, why?
Дата
Msg-id 3F21CA69.7020004@mascari.com
обсуждение исходный текст
Ответ на Re: Wacky query plan, why?  ("Maksim Likharev" <mlikharev@aurigin.com>)
Список pgsql-general
Maksim Likharev wrote:

> My be I too spoiled by MS SQL Server, but does'nt
> syntax:
>
> update prod.t_results set expdate=e.termdate from
>      work.termdate e, prod.t_results r where e.docid=r.docid;
> or
> update prod.t_results set expdate=e.termdate from
>      work.termdate e inner join prod.t_results r on e.docid=r.docid;
>
> is standard SQL-92 update FROM form?
> just trying to understand.

13.10  <update statement: searched>

         Function

         Update rows of a table.

         Format

         <update statement: searched> ::=
              UPDATE <table name>
                SET <set clause list>
                [ WHERE <search condition> ]


So, for SQL92:

UPDATE prod.t_results
SET expdate = (
 SELECT e.termdate
 FROM work.termdate e
 WHERE e.docid = prod.t_results.docid
);

If a 'termdate.docid' does not necessarily exist for every
't_results.docid' then you must further qualify the update to ensure
expdate won't be set to NULL (or die trying):

UPDATE prod.t_results
SET expdate = (
 SELECT e.termdate
 FROM work.termdate e
 WHERE e.docid = prod.t_results.docid
)
WHERE EXISTS (
 SELECT 1
 FROM work.termdate e
 WHERE e.docid = prod.t_results.docid
);

That's SQL92 and it's ugly. I prefer the PostgreSQL extended form:

UPDATE prod.t_results
SET expdate = work.termdate.termdate
WHERE prod.t_results.docid = work.termdate.docid;

Hope that helps,

Mike Mascari
mascarm@mascari.com



В списке pgsql-general по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: Using YY-MM-DD date input
Следующее
От: Stephan Szabo
Дата:
Сообщение: Re: Wacky query plan, why?