SQL:加入最佳字符串匹配

时间:2013-12-16 09:31:25

标签: sql sql-server

我有一个带有字符串“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

2 个答案:

答案 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 )

似乎工作......

SQLFiddle