2010-02-24 113 views
2

我不确定在另一个问题中是否有这种确切的情况,所以对不起,如果这是重复的。我与分类系统出了问题,我使用我有以下查询(例如)如何使用SELECT IN查询进行部分匹配?

SELECT DISTINCT COUNT(StockID) 
FROM tblStock 
WHERE CategoryCode IN (
SELECT CategoryCode 
FROM tblLookup 
WHERE CategoryID = 'EG') 

我需要做tblLookup的CategoryCode和tblStock类别代码之间的部分匹配 - 上面返回查询完整匹配如EG将返回类别代码的ETC和EGT,但如果该类别是ETCE,则不会找到。
我怎么能修改查询这样的成绩从返回:

可能是使用了在tblStock,其中返回的CategoryCodes是ETC和EGT但也有需要通配符匹配部分匹配。

+1

@Tuomas:在'SQL Server','IN'比'JOIN'更有效:http://explainextended.com/2009/ 06/16/in-vs-join-vs-exists/ – Quassnoi 2010-02-24 12:45:03

+0

@Quassnoi:嗯......很好的链接,谢谢! – 2010-02-24 12:59:48

回答

2
SELECT COUNT(StockID) 
FROM (
     SELECT DISTINCT '%' + CategoryCode + '%' AS Expr 
     FROM tblLookup 
     WHERE CategoryID = 'EG' 
     ) cats 
JOIN tblStock s 
ON  s.CategoryCode LIKE cats.Expr 

一个示例脚本重现:

DECLARE @tblStock TABLE (StockID INT NOT NULL, CategoryCode VARCHAR(100) NOT NULL, quantity FLOAT NOT NULL) 
DECLARE @tblLookup TABLE (CategoryID VARCHAR(100) NOT NULL, CategoryCode VARCHAR(100) NOT NULL) 

INSERT 
INTO @tblStock 
VALUES (1, 'ETCE', 100) 

INSERT 
INTO @tblStock 
VALUES (2, 'ETC', 200) 

INSERT 
INTO @tblStock 
VALUES (3, 'FOO', 300) 

INSERT 
INTO @tblLookup 
VALUES ('EG', 'ETC') 

INSERT 
INTO @tblLookup 
VALUES ('EG', 'EGT') 

SELECT * 
FROM (
     SELECT DISTINCT '%' + CategoryCode + '%' AS Expr 
     FROM @tblLookup 
     WHERE CategoryID = 'EG' 
     ) cats 
JOIN @tblStock s 
ON  s.CategoryCode LIKE cats.Expr 
+0

我已经尝试过这样的事情,但是当我做连接时,它只能与“=”一起使用,而不是像最后一部分那样使用LIKE,因为除非它完全匹配,否则它不会返回任何内容。 – RoguePlanetoid 2010-02-24 14:58:57

+0

@Rogue:我添加了一个示例脚本来演示原理。 – Quassnoi 2010-02-24 15:06:34

+0

感谢这个例子 - 这是我自己的错误 - 原来我的查找表中有空格,当它被转换时出现 - 这是问题 - 再次感谢!帮助我找出真正的问题! – RoguePlanetoid 2010-02-24 15:21:46