We help IT Professionals succeed at work.

Check out our new AWS podcast with Certified Expert, Phil Phillips! Listen to "How to Execute a Seamless AWS Migration" on EE or on your favorite podcast platform. Listen Now

x

T-SQL: Making an ugly query better

180246
180246 asked
on
Medium Priority
336 Views
Last Modified: 2012-06-27
I can usually get by when it comes to SQL, but I'm no whiz. In the example I've included, the task is to end up with a list of:

* all search records that match the user's search criterion (lastname starts with T), OR
* that have email addresses matching records in the first group.

I have a query that seems (after minimal testing) to work. First I get the name matches; then supplement my results with the matching non-blank emails; then, for cases of multiple identical emails, I show only the record with the best (lowest) Priority score.

My question is: is there a more concise way to rephrase this query? (I don't have the option to restructure the database.) Something that left me with about three less WITH's -- i.e., a lone query -- would be ideal, but any improvement would be good.

WITH
NarrowedTable AS
(select id, email from tmp_test
where (lastname like 't%')),
 
ExtraEmailsTable AS
(select id from NarrowedTable
union
select id from tmp_test tt
where (coalesce(tt.email, '') > '')
and (tt.email in (select email from narrowedtable))),
 
InnerTable AS(
SELECT row_number() over(partition by email order by priority) as myrank,
id,
email,
lastname
from tmp_test tt
where (coalesce(Email, '') > '')
and (tt.id in (select id from ExtraEmailsTable))
union
SELECT 1 as myrank,
id,
email,
lastname
from tmp_test tt
where (coalesce(Email, '') = '')
and (tt.id in (select id from ExtraEmailsTable)))
 
select * from InnerTable
where myrank = 1
order by Email, lastname;

Open in new window

Comment
Watch Question

Billing Engineer
CERTIFIED EXPERT
Most Valuable Expert 2014
Top Expert 2009
Commented:
Unlock this solution with a free trial preview.
(No credit card required)
Get Preview
Chris LuttrellSenior Database Architect
CERTIFIED EXPERT
Commented:
Unlock this solution with a free trial preview.
(No credit card required)
Get Preview
Rob FarleyConsultant
CERTIFIED EXPERT
Commented:
Unlock this solution with a free trial preview.
(No credit card required)
Get Preview

Author

Commented:
Thank you all for the feedback! It's good to know I wasn't too far out in left field. I'm not aware of any performance problems with it at this point -- just figured that since I was using some features I haven't touched before, I should get a sanity check. I hope an even split of points (as even as I could make it) will be OK with you all.
Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a free trial preview!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.