2010-02-24 5 views
2

Je ne suis pas sûr qu'il y ait cette situation exacte dans une autre question, donc désolé si c'est un doublon. J'ai un problème avec le système de catégorie J'utilise je la requête suivante (par exemple)Comment faire une correspondance partielle avec une requête SELECT IN?

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

je dois faire une correspondance partielle entre le CategoryCode dans tblLookup et le code de catégorie dans tblStock - la requête ci-dessus retours les correspondances complètes telles que EG auraient ETC et EGT comme codes de catégorie renvoyés mais si la catégorie est ETCE alors ceci ne serait pas trouvé.
Comment pourrais-je modifier la requête afin que les résultats renvoyés par:

pourrait être utilisé pour la correspondance partielle dans tblStock, où les CategoryCodes sont retournés ETC et EGT mais il y a des correspondances génériques nécessaires aussi.

+1

@Tuomas: Dans SQL 'Server',' IN' est plus efficace qu'un 'JOIN': http://explainextended.com/2009/ 06/16/in-vs-join-vs-exists/ – Quassnoi

+0

@Quassnoi: Hmm ... Beau lien, merci! –

Répondre

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 

Un exemple de script pour reproduire:

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

J'ai essayé quelque chose comme ça mais quand je fais la jointure ça ne marche qu'avec "=" et non avec LIKE pour la dernière partie, car elle ne retourne rien à moins que ce soit une correspondance exacte. – RoguePlanetoid

+0

@Rogue: J'ai ajouté un exemple de script pour démontrer le principe. – Quassnoi

+0

Merci pour l'exemple - C'était ma propre erreur - il est apparu qu'il y avait des espaces dans ma table de recherche, qui est arrivé quand il a été converti - c'était le problème - merci encore! M'a aidé à comprendre le vrai problème! – RoguePlanetoid

Questions connexes