我有一个带有字符串“identifier”的表,我希望在“group”表上匹配,找到“最佳匹配”(即:包含字符串较长部分的匹配)。 例如:假设我有两组:“19”和“19.10”。我想要的是:
item "19.10.1" is part of the group "19.10"
item "19.10.xxxx" is part of the group "19.10"
item "19.20" is part of the group "19"
到目前为止我得到的是这样的:
SELECT * FROM Items i
LEFT JOIN MyGroup g ON g.Prefix = SUBSTRING(i.ItemID,1,LEN(g.Prefix))
匹配所有字符串,但我不知道如何从我的结果中过滤“最佳匹配”(即较长的匹配)。
顺便说一下,我正在研究SQL Server 2005。
示例SQL小提琴: http://sqlfiddle.com/#!3/9a9d8/1
答案 0 :(得分:4)
试试这个。
SELECT t.ItemID, g1.prefix, g1.GroupDesc
FROM Items i1
LEFT JOIN MyGroup g1 ON g1.Prefix = SUBSTRING(i1.ItemID,1,LEN(g1.Prefix))
RIGHT JOIN
(
SELECT i2.ItemID, max(len(g2.prefix)) AS ln
FROM Items i2
LEFT JOIN MyGroup g2 ON g2.Prefix = SUBSTRING(i2.ItemID,1,LEN(g2.Prefix))
GROUP BY i2.ItemID
) t ON i1.ItemID = t.ItemID AND len(g1.prefix) = t.ln
您可以在此测试数据上进行测试:
CREATE TABLE dbo.MyGroup
(GroupDesc VARCHAR(100),
Prefix VARCHAR(10) );
CREATE TABLE dbo.Items
(ItemDesc VARCHAR(100),
ItemID VARCHAR(10) );
INSERT INTO MyGroup (GroupDesc, Prefix)
VALUES ( 'Group A', '19' );
INSERT INTO MyGroup (GroupDesc, Prefix)
VALUES ( 'Group B', '19.10' );
INSERT INTO MyGroup (GroupDesc, Prefix)
VALUES ( 'Group C', '19.10.3' );
INSERT INTO Items (ItemDesc, ItemID)
VALUES ( 'Item 1', '19.10.4' );
INSERT INTO Items (ItemDesc, ItemID)
VALUES ( 'Item 2', '19.10.3' );
INSERT INTO Items (ItemDesc, ItemID)
VALUES ( 'Item 3', '19.20' );
INSERT INTO Items (ItemDesc, ItemID)
VALUES ( 'Item 4', '44.55' );
答案 1 :(得分:1)
我想出了这个:
with tmp as
(
SELECT * FROM Items i
LEFT JOIN MyGroup g ON g.Prefix = SUBSTRING(i.ItemID,1,LEN(g.Prefix))
)
SELECT a.* FROM tmp a WHERE LEN(a.prefix) = (SELECT MAX(LEN(b.prefix)) FROM tmp b WHERE a.itemid = b.itemid )
似乎工作......