2010-02-24 108 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