Expiring Today—Celebrate National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

Better/Quicker Way to Join on LIKE in SQL Server?

Posted on 2015-02-20
3
Medium Priority
?
89 Views
Last Modified: 2015-03-03
Hello,

I have two sets of data I'm trying to join, but the query is so slow it times out even with very small sections of the data.

The first set of data is an email address and a comma-separated list of categories.

Email_Address	Customer_Categories
bob1@bob.com	592,593
bob2@bob.com	592,593,597
bob3@bob.com	602

Open in new window


The second set of data is a list of SKUs which have one category ID associated with them on each row:

productcode	categoryid
2036814		592
2102602		593
2031181		597
2031212		597
2102602		599
2102602		602
2102602		608
2102602		610
2102602		611

Open in new window


I've tried to create join the two result sets on a LIKE condition

SELECT
	CustomerTable.EmailAddress, 
	ProductTable.ProductCode
FROM 
	(SELECT EmailAddress, Customer_Categories FROM Customers) AS CustomerTable
JOIN 
	(SELECT ProductCode, CategoryID FROM Products) AS ProductTable
ON
	CustomerTable.Customer_Categories LIKE ProductTable.CategoryID

Open in new window


but either there's too much data, the query is too slow, or both. Is there a better or more efficient way to do this sort of query in SQL Server?
0
Comment
Question by:vacpartswarehouse
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
3 Comments
 
LVL 35

Accepted Solution

by:
ste5an earned 2000 total points
ID: 40622434
Sure is there a quicker solution: normalize your data. That's what gives you the best performance.

You need a split function when you want to do it inline, e.g. like here.
0
 
LVL 48

Expert Comment

by:Dale Fye
ID: 40623025
Have to agree with ste5an.  Your CustomerCategories column is not normalized and the Like argument in your SQL will take forever with large datasets.  Your customer Categories table should look like:

CustomerID    CategoryID
1                            592
1                            593
2                            592
2                            593
2                            597
3                            602

and you should have a Customers table which contains the CustomerID and email address, along with other customer specific fields.
0
 
LVL 52

Expert Comment

by:Vitor Montalvão
ID: 40625308
Can't understand why do you have 2 sub-queries. You can use a single query for that:
SELECT
	Customers.EmailAddress, 
	Products.ProductCode
FROM Customers, Products 
WHERE Customers.Customer_Categories LIKE Products.CategoryID

Open in new window

0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Why is this different from all of the other step by step guides?  Because I make a living as a DBA and not as a writer and I lived through this experience. Defining the name: When I talk to people they say different names on this subject stuff l…
Ever needed a SQL 2008 Database replicated/mirrored/log shipped on another server but you can't take the downtime inflicted by initial snapshot or disconnect while T-logs are restored or mirror applied? You can use SQL Server Initialize from Backup…
Familiarize people with the process of retrieving data from SQL Server using an Access pass-thru query. Microsoft Access is a very powerful client/server development tool. One of the ways that you can retrieve data from a SQL Server is by using a pa…
This video shows how to set up a shell script to accept a positional parameter when called, pass that to a SQL script, accept the output from the statement back and then manipulate it in the Shell.

719 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question