Reply to Re: SELECT works but UPDATE fails. ?

Your name:

Reply:


Posted by Erland Sommarskog on 06/04/05 01:41

Hugo Kornelis (hugo@pe_NO_rFact.in_SPAM_fo) writes:
> Erland already pointed out that the proprietary UPDATE FROM syntax
> differs between products. However, why use proprietary code when you can
> use ANSI-standard code that will work on almost all databases:
>
> update ded_temp
> set balance = (select sum(b.ln_amt)
> from ded_temp b
> where ded_temp.cust_no = b.cust_no
> and ded_temp.ded_type_cd = b.ded_type_cd
> and ded_temp.chk_no = b.chk_no
> group by cust_no, ded_type_cd, chk_no)

Could you please explain what this miserable piece of code means? You
have two ded_temp in the query, so which ded_temp does ded_temp.cust_no
refer to?

You will have to excuse, but I think it's poor advice to suggest that
people should use code that is ambiguous. I don't really care if there
is wording in ANSI that disamguiates the query, it's still bad practice,
because for a human the query is about incomprehensible. (And I would
not be surprised if more than one engine gets lost on the query above,
so I would not even trust the elusive compatibility.)

The ANSI standard does not provide a place to put in an alias, and
that is a serious shortcoming. In this case, it leads to the nonsese
above. In other cases, imagine that you have a table by the of
instrumentclearingmarketplaces - writing that over and over again
is completely out of the question.

> BTW, you can also omit the GROUP BY clause, since the subquery will only
> match rows for one set of (cust_no, ded_type_cd, chk_no) anyway - this
> might even give you some performance gain!

For some real serious peformance gain, this is likely to be a true
winner:

UPDATE ded_temp
SET balance = b.ln_amt
FROM ded_temp a
JOIN (SELECT cust_no, ded_type_cd, chk_no, ln_amt = sum(b.ln_amt)
FROM ded_temp
GROUP BY cust_no, ded_type_cd, chk_no) AS b
ON a.cust_no = b.cust_no
AND a.ded_type_cd = b.ded_type_cd
AND a.ded_temp.chk_no = b.chk_no

I can give no guarantees, but my experience is that a join with a derived
table results in a lot more effecient plan, than a correlated subquery.

--
Erland Sommarskog, SQL Server MVP, esquel@sommarskog.se

Books Online for SQL Server SP3 at
http://www.microsoft.com/sql/techinfo/productdoc/2000/books.asp

[Back to original message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация