Select a.list_id, a.company_name, a.company_description, a.url,
( case when (Select upper(County_Name) from tbl_County where County_id=a.County_id) is null then
(Select upper(Country_Name) from tbl_description_Country where Country_id= a.Country_id)
else
(Select upper(County_Name) from tbl_County where County_id= a.County_id) end )
as County_name,
b.review_approval,
( case when (Select county_id from tbl_County where County_id = a.County_id)= 0 then
(Select Country_id from tbl_description_Country where Country_id = a.Country_id)
else
(Select county_id from tbl_County where County_id= a.County_id) end )
as CountryID,
dbo.funcGetRatingSum (a.list_id) as ratingSum,
dbo.funcGetRatingCount (a.list_id) as totalCount,
(Select case when (select top 1 banner_path from tbl_banners where list_id = a.list_id and a.subscription_id = 2) is null then
''
else
(select top 1 banner_path from tbl_banners where list_id = a.list_id and a.subscription_id = 2) end)
as bannerpath
from tbl_directorylisting a, tbl_preferences as b ,
tbl_companymaster c where a. status = 1 and(a.company_id =
b.company_id And a.status = 1) and c.category_id= @CategoryID
and a.company_id= c.company_id and a.subscription_id in (2,3) and subscription_date >= (dateadd(year,-1,getdate()))
Order by county_name, a.subscription_id asc, a.date_fee_paid
Actually it was within several lines of concatenated text values, and had no formatting whatsoever!. My first intention was try to make it a stored procedure, but doing so I couldn't help but try to optimize it a little. Here's my attempt....Select
listing.list_id,
listing.company_name,
listing.company_description,
listing.url,
Coalesce(county.County_name, country.Country_Name) As County_name,
prefs.review_approval,
listing.Country_ID,
dbo.funcGetRatingSum (listing.list_id) as ratingSum,
dbo.funcGetRatingCount (listing.list_id) as totalCount,
Coalesce((select top 1 banner_path from tbl_banners where list_id = listing.list_id and listing.subscription_id = 2), '') as bannerpath
FROM
tbl_directorylisting listing
Inner Join tbl_preferences prefs
On listing.company_id = prefs.company_id
Inner Join tbl_companymaster company
On listing.company_id = company.company_id
Left Outer Join tbl_county county
On listing.county_id = county.county_id
Inner Join tbl_country country
On listing.country_id = country.country_id
where listing.status = 1
And company.category_id= @CategoryID
and listing.subscription_id in (2,3)
and listing.subscription_date >= (dateadd(year,-1,getdate()))
Order by county_name, listing.subscription_id asc, listing.date_fee_paid
Firstly you'll notice the second query is far easier to read (hopefully). I dont stand for the old skool method of joining tables, join with a join and it's obvious what is going on, plus it prepares isolation of results for the where clause afterwards.Secondly there are fewer joins in the Column definition part of the select. I have included one of the original selects, because when optimizing the stored procedure it was siginificantly fast enough to use select top 1 ... than it was to Left Outer Join. I did however Coalesce so that the case statement didn't repeat iteself.
What do you think? Is that better or worse?
1 comment:
Geek
Post a Comment