Author |
Topic |
kamii47
Constraint Violating Yak Guru
353 Posts |
Posted - 2007-02-12 : 05:48:49
|
I have a table in which there are 100 of thousand of record.In on e of the stored procedure I am updating different columns in different go.Now I want's to update them in a one go.How can I do itqueries in my stored procedures areUPDATE Job SET CompanyName=c.Name FROM Job j JOIN Company c ON j.CompanyID=c.CompanyID WHERE CompanyName IS NULL AND NOT ((c.Name IS NULL) OR (c.Name='.')) UPDATE Job SET CompanyDescription=left(c.Description,1000) FROM Job j JOIN Company c ON j.CompanyID=c.CompanyID WHERE ((CompanyDescription IS NULL) OR (CompanyDescription=' ')) AND NOT ((c.Description IS NULL) OR (c.Description='.' OR (c.Description=' '))) UPDATE Job SET HomePageURL=c.URL FROM Job j JOIN Company c ON j.CompanyID=c.CompanyID WHERE HomePageURL IS NULL AND NOT ((c.URL IS NULL) OR (c.URL='.')) ------------------------------- -- Do updates from the Branch Table UPDATE Job SET ContactAddr1=b.Address1 FROM Job j JOIN Branch b ON j.CompanyID=b.CompanyID AND j.BranchID=b.BranchID WHERE ContactAddr1 IS NULL AND NOT ((b.Address1 IS NULL) OR (b.Address1='.')) UPDATE Job SET ContactAddr2=b.Address2 FROM Job j JOIN Branch b ON j.CompanyID=b.CompanyID AND j.BranchID=b.BranchID WHERE ContactAddr2 IS NULL AND NOT ((b.Address2 IS NULL) OR (b.Address2='.')) UPDATE Job SET ContactCity=b.City FROM Job j JOIN Branch b ON j.CompanyID=b.CompanyID AND j.BranchID=b.BranchID WHERE ContactCity IS NULL AND NOT ((b.City IS NULL) OR (b.City='.')) UPDATE Job SET ContactState=b.State FROM Job j JOIN Branch b ON j.CompanyID=b.CompanyID AND j.BranchID=b.BranchID WHERE ContactState IS NULL AND NOT ((b.State IS NULL) OR (b.State='.')) UPDATE Job SET ContactCountry=b.Country FROM Job j JOIN Branch b ON j.CompanyID=b.CompanyID AND j.BranchID=b.BranchID WHERE ContactCountry IS NULL AND NOT ((b.Country IS NULL) OR (b.Country='.')) UPDATE Job SET ContactPostal=b.ZipCode FROM Job j JOIN Branch b ON j.CompanyID=b.CompanyID AND j.BranchID=b.BranchID WHERE ContactPostal IS NULL AND NOT ((b.ZipCode IS NULL) OR (b.ZipCode='.')) UPDATE Job SET ContactName=bc.Name FROM Job j JOIN BranchContacts bc ON j.CompanyID=bc.CompanyID AND j.BranchID=bc.BranchID AND j.ContactID=bc.ContactID WHERE ContactName IS NULL AND NOT ((bc.Name IS NULL) OR (bc.Name='.')) UPDATE Job SET ContactTitle=bc.Title FROM Job j JOIN BranchContacts bc ON j.CompanyID=bc.CompanyID AND j.BranchID=bc.BranchID AND j.ContactID=bc.ContactID WHERE ContactTitle IS NULL AND NOT ((bc.Title IS NULL) OR (bc.Title='.')) UPDATE Job SET ContactPhone=bc.Phone FROM Job j JOIN BranchContacts bc ON j.CompanyID=bc.CompanyID AND j.BranchID=bc.BranchID AND j.ContactID=bc.ContactID WHERE ContactPhone IS NULL AND NOT ((bc.Phone IS NULL) OR (bc.Phone='.')) UPDATE Job SET ContactFax=bc.Fax FROM Job j JOIN BranchContacts bc ON j.CompanyID=bc.CompanyID AND j.BranchID=bc.BranchID AND j.ContactID=bc.ContactID WHERE ContactFax IS NULL AND NOT ((bc.Fax IS NULL) OR (bc.Fax='.') OR (bc.Fax='0')) |
|
nr
SQLTeam MVY
12543 Posts |
Posted - 2007-02-12 : 06:19:16
|
UPDATE Job SET CompanyName = case when WHERE CompanyName IS NULL AND NOT ((c.Name IS NULL) OR (c.Name='.')) then c.Name else j.CompanyName end ,CompanyDescription = case when ((CompanyDescription IS NULL) OR (CompanyDescription=' ')) AND NOT ((c.Description IS NULL) OR (c.Description='.' OR (c.Description=' '))) then left(c.Description,1000) else j.CompanyDescription end........FROM Job j JOIN Company c ON j.CompanyID=c.CompanyID==========================================Cursors are useful if you don't know sql.DTS can be used in a similar way.Beer is not cold and it isn't fizzy. |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-02-12 : 06:21:18
|
First three UPDATEs can be replaced with this one.UPDATE j SET j.CompanyName = CASE WHEN c.Name IS NULL OR c.Name = '.' THEN j.CompanyName ELSE c.Name END, j.CompanyDescription = CASE WHEN AND c.Description IS NULL OR c.Description IN ('.', ' ') THEN j.CompanyDescription ELSE LEFT(c.Description, 1000) END, j.HomePageURL = CASE WHEN c.URL IS NULL OR c.URL = '.' THEN j.HomePageURL ELSE c.URL ENDFROM Job AS jINNER JOIN Company AS c ON j.CompanyID = c.CompanyIDWHERE j.CompanyName IS NULL OR j.CompanyDescription IS NULL OR j.CompanyDescription = ' ' OR j.HomePageURL IS NULL Peter LarssonHelsingborg, Sweden |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-02-12 : 06:32:28
|
Next six UPDATEs can be replaced with thisUPDATE jSET j.ContactAddr1 = CASE WHEN b.Address1 IS NULL OR b.Address1 = '.' THEN j.ContactAddr1 ELSE b.Address1 END, j.ContactAddr2 = CASE WHEN b.Address2 IS NULL OR b.Address2 = '.' THEN j.ContactAddr2 ELSE b.Address2 END, j.ContactCity = CASE WHEN b.City IS NULL OR b.City = '.' THEN j.ContactCity ELSE b.City END, j.ContactState = CASE WHEN b.State IS NULL OR b.State '.' THEN j.ContactState ELSE b.State END, j.ContactCountry = CASE WHEN b.Country IS NULL OR b.Country = '.' THEN j.ContactCountry ELSE b.Country END, j.ContactPostal = CASE WHEN b.ZipCode IS NULL OR b.ZipCode = '.' THEN j.ContactPostal ELSE b.ZipCode ENDFROM Job AS jINNER JOIN Branch AS b ON b.CompanyID = j.CompanyID AND b.BranchID = j.BranchIDWHERE j.ContactAddr1 IS NULL OR j.ContactAddr2 IS NULL OR j.ContactCity IS NULL OR j.ContactState IS NULL OR j.ContactCountry IS NULL OR j.ContactPostal IS NULL Peter LarssonHelsingborg, Sweden |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-02-12 : 07:05:25
|
Last four with thisUPDATE jSET j.ContactName = CASE WHEN b.Name IS NULL OR b.Name = '.' THEN j.ContactName ELSE b.Name END, j.ContactTitle = CASE WHEN b.Title IS NULL OR b.Title = '.' THEN j.ContactTitle ELSE b.Name END, j.ContactPhone = CASE WHEN b.Phone IS NULL OR b.Phone = '.' THEN j.ContactPhone ELSE b.Phone END, j.ContactFax = CASE WHEN b.Fax IS NULL OR b.Fax IN ('.', '0') THEN j.ContactFax ELSE b.Fax ENDFROM Job AS jINNER JOIN Branch AS b ON b.CompanyID = j.CompanyID AND b.BranchID = j.BranchID AND j.ContactID = b.ContactIDWHERE j.ContactName IS NULL OR j.ContactTitle IS NULL OR j.ContactPhone IS NULL OR j.ContactFax IS NULL Peter LarssonHelsingborg, Sweden |
 |
|
kamii47
Constraint Violating Yak Guru
353 Posts |
Posted - 2007-02-12 : 07:15:28
|
Do i really need to override the value again if the value for case is false.Like for follwing statement j.ContactName = CASE WHEN b.Name IS NULL OR b.Name = '.' THEN j.ContactName ELSE b.Name END,j.ContactTitle = CASE WHEN b.Title IS NULL OR b.Title = '.' THEN j.ContactTitle ELSE b.Name END,Could Below statement without else clause be legal[I doesn't want's to update the value which is already correct]j.ContactName = CASE WHEN b.Name IS NULL OR b.Name = '.' THEN j.ContactName END,j.ContactTitle = CASE WHEN b.Title IS NULL OR b.Title = '.' THEN j.ContactTitle END, |
 |
|
harsh_athalye
Master Smack Fu Yak Hacker
5581 Posts |
Posted - 2007-02-12 : 07:18:55
|
"Do i really need to override the value again if the value for case is false."Yes."Could Below statement without else clause be legal"Without ELSE clause it will replace column value as NULL when case condition results in false.Harsh AthalyeIndia."The IMPOSSIBLE is often UNTRIED" |
 |
|
kamii47
Constraint Violating Yak Guru
353 Posts |
Posted - 2007-02-12 : 07:31:16
|
Also for UPDATE JobSET CompanyDescription=left(c.Description,1000)FROM Job j JOIN Company c ON j.CompanyID=c.CompanyIDWHERE ((CompanyDescription IS NULL) OR (CompanyDescription=' ')) AND NOT ((c.Description IS NULL) OR (c.Description='.' OR (c.Description=' ')))is the Following query is equvalent ? [I am not sure]UPDATE j SET j.CompanyDescription = CASE WHEN c.Description IS NULL OR c.Description IN ('.', ' ') THEN j.CompanyDescription ELSE LEFT(c.Description, 1000) END FROM Job AS jINNER JOIN Company AS c ON j.CompanyID = c.CompanyIDWHERE j.CompanyDescription IS NULL |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-02-12 : 07:34:26
|
In my suggestion I also added OR j.CompanyDescription = ' 'Did you miss that?Peter LarssonHelsingborg, Sweden |
 |
|
kamii47
Constraint Violating Yak Guru
353 Posts |
Posted - 2007-02-12 : 07:38:07
|
quote: Originally posted by harsh_athalye "Do i really need to override the value again if the value for case is false."Yes."Could Below statement without else clause be legal"Without ELSE clause it will replace column value as NULL when case condition results in false.Harsh AthalyeIndia."The IMPOSSIBLE is often UNTRIED"
Then I think this approach will not be well suited as I have 100 of thousand of records so so many insertion again.[Is n't it ?]Can any body suggest me any other work around ? |
 |
|
harsh_athalye
Master Smack Fu Yak Hacker
5581 Posts |
Posted - 2007-02-12 : 07:41:52
|
I don't think this is added performance penalty. Insert/Updates works in chunks of pages, so whether you insert/update a single column or 50 columns, it hardly matters unless you have clustered index set up on those columns.Harsh AthalyeIndia."The IMPOSSIBLE is often UNTRIED" |
 |
|
kamii47
Constraint Violating Yak Guru
353 Posts |
Posted - 2007-02-12 : 12:53:55
|
I am not saying about number of column.I am asking about overhead of updating the table again with the same value[value mihgt be too large]Could some how I can escape from this ? |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-02-12 : 13:07:47
|
You filter out the records to update.You will get some more records, correct, but you only have to JOIN 3 times in total instead of 10 times! There is the performance gain!Peter LarssonHelsingborg, Sweden |
 |
|
kamii47
Constraint Violating Yak Guru
353 Posts |
Posted - 2007-02-13 : 05:41:17
|
Is the Following is more correct---------------------Company-----------------------------UPDATE j SET j.CompanyName = CASE WHEN CompanyName IS NULL AND NOT ((c.Name IS NULL) OR (c.Name='.')) Then c.Name Else j.CompanyName END, j.CompanyDescription = CASE WHEN ((CompanyDescription IS NULL) OR (CompanyDescription=' ')) AND NOT ((c.Description IS NULL) OR (c.Description='.' OR (c.Description=' '))) Then LEFT(c.Description, 1000) Else j.CompanyDescription END, j.HomePageURL = CASE WHEN HomePageURL IS NULL AND NOT ((c.URL IS NULL) OR (c.URL='.')) THEN c.URL ELSE j.HomePageURL ENDFROM Job AS jINNER JOIN Company AS c ON j.CompanyID = c.CompanyID-----------------------------------Contact-------------------------------------UPDATE jSET j.ContactName = CASE WHEN j.ContactName IS NULL AND NOT ((b.Name IS NULL) OR (b.Name='.')) Then b.Name Else j.ContactName END, j.ContactTitle = CASE WHEN j.ContactTitle IS NULL AND NOT ((b.Title IS NULL) OR (b.Title='.')) Then b.Name Else j.ContactTitle END, j.ContactPhone = CASE WHEN j.ContactPhone IS NULL AND NOT ((b.Phone IS NULL) OR (b.Phone='.')) Then b.Name Else j.ContactPhone END, j.ContactFax = CASE WHEN j.ContactFax IS NULL AND NOT ((b.Fax IS NULL) OR (b.Fax='.')) Then b.Name Else j.ContactFax ENDFROM Job AS jINNER JOIN BranchContacts AS b ON b.CompanyID = j.CompanyID AND b.BranchID = j.BranchID AND j.ContactID = b.ContactID---------------------------Branch--------------UPDATE jSET j.ContactAddr1 = CASE WHEN ContactAddr1 IS NULL AND NOT ((b.Address1 IS NULL) OR (b.Address1='.')) THEN b.Address1 ELSE j.ContactAddr1 END, j.ContactAddr2 = CASE WHEN ContactAddr2 IS NULL AND NOT ((b.Address2 IS NULL) OR (b.Address2='.')) THEN b.Address2 ELSE j.ContactAddr2 END, j.ContactCity = CASE WHEN ContactCity IS NULL AND NOT ((b.City IS NULL) OR (b.City='.')) THEN b.City ELSE j.ContactCity END, j.ContactState = CASE WHEN ContactState IS NULL AND NOT ((b.State IS NULL) OR (b.State='.')) THEN b.State ELSE j.ContactState END, j.ContactCountry = CASE WHEN ContactCountry IS NULL AND NOT ((b.Country IS NULL) OR (b.Country='.')) THEN b.Country ELSE j.ContactCountry END, j.ContactPostal = CASE WHEN ContactPostal IS NULL AND NOT ((b.ZipCode IS NULL) OR (b.ZipCode='.')) THEN b.ZipCode ELSE j.ContactPostal ENDFROM Job AS jINNER JOIN Branch AS b ON b.CompanyID = j.CompanyID AND b.BranchID = j.BranchID |
 |
|
|