2014-11-03 116 views
0

我的SQL Server 2008R2找到匹配的记录集

消息表

ContrlNo| LineNo  | Msg 
    1  |  1  | Tiger1 Text 
    1  |  2  | Tiger1 Text 
    1  |  3  | Tiger1 Text 
    1  |  4  | Tiger1 Text 
    2  |  1  | Tiger1 Text1 
    2  |  2  | Tiger1 Text2 
    2  |  3  | Tiger1 Text3 
    2  |  4  | Tiger1 Text4 
    3  |  1  | Horse 1 
    3  |  2  | Horse 2 
    3  |  3  | Horse 3 
    3  |  4  | Horse 4 

RuleTable

RuleNo| MsgLineNo | RuleStartingPos | RuleMsg 
1  |  1  | 1    | Tiger1 Text 
2  |  1  | 1    | Tiger1 Text 
2  |  3  | 1    | Tiger1 Text3 

对于每一组ControlNo记录对下面的表MESSAGETABLE我想应用规则fr om RULETABLE并列出RULENo,如果有任何mataches。

如果您看到规则表,则规则2与规则1重叠。要求是为每个控制号获得最匹配的规则编号。该预期的结果,

ContrlNo | RuleNo 
1 | 1 
2 | 2 
3 | NULL 

感谢, 周杰伦

+0

我不明白背后的预期结果你的逻辑。你能更彻底地解释一下吗? – 2014-11-03 19:36:00

+0

我们需要为每个ContrlNo获取所有记录(LineNo,Msg),并将其与RuleTable(MsgLineNo,RuleMsg)进行匹配。 – Jay 2014-11-03 19:46:54

+0

例如,如果我们从MessageTable获取属于控件号1的记录并将其与RuleTable匹配,则RuleNo 1匹配100%。但RuleNo 2有两个条件,规则2的第二个条件不匹配。所以结果是,ContrlNo | RuleNo(1 | 1)。 如果我们从MessageTable中获取属于ContrlNo 2的记录并将其与RuleTable进行匹配,则RuleNo 1匹配100%。但RuleNo 2有两个条件,它们都匹配100%。因为我们需要最大的匹配规则,所以在这种情况下,结果是ContrlNo | RuleNo(2 | 2)。 – Jay 2014-11-03 19:56:03

回答

0

我相信以下将检索列出的结果:它会显示与拥有最匹配线(相关规则的控制数,如果像你的第一个情况下,两个规则具有相同数量的匹配,它将检查MatchPercent)。

SELECT MT.ContrlNo, r.RuleNo, r.MatchPercent 
FROM 
    MessageTable MT 
    LEFT JOIN 
    (
     SELECT 
     ContrlNo, 
     RuleNo, 
     MatchedRules/AvailableRules AS MatchPercent, 
     ROW_NUMBER() OVER (PARTITION BY ContrlNo ORDER BY MatchedRules DESC, MatchedRules/AvailableRules DESC) AS rn 
     FROM 
     (
      SELECT 
      ContrlNo, 
      R.RuleNo, 
      COUNT(*) as MatchedRules, 
      (SELECT COUNT(*) FROM RuleTable WHERE RuleTable.RuleNo = R.RuleNo) + 0.0 AS AvailableRules 
      FROM 
       MessageTable M 
       INNER JOIN 
       RuleTable R ON 
        M.[LineNo] = R.MsgLineNo AND 
        SUBSTRING(M.Msg,R.RuleStartingPos,LEN(R.RuleMsg)) LIKE '%' + R.RuleMsg + '%' 
      GROUP BY M.ContrlNo, R.RuleNo 
     ) q 
    ) r ON 
    MT.ContrlNo = r.ContrlNo AND 
    r.rn = 1 
GROUP BY MT.ContrlNo, r.RuleNo, r.MatchPercent 

SQL Fiddle

+0

谢谢你这么多.. ..真的钉上了它。 – Jay 2014-11-04 21:35:16

0

第一子查询获得总匹配规则和第二子查询得到的总规则,当这两个条件相匹配,那么我们展示RuleNo其他明智NULL因为我们使用LEFT JOIN

Select A.ContrlNo, ISNULL(T.RuleNo,0) as RuleNo FROM 
( select ContrlNo, COUNT(R.RuleNo) as MatchedRules 
    FROM Messages M 
    LEFT JOIN Rules R 
    on M.[LineNo] = R.MsgLineNo 
    and SUBSTRING(M.Msg,R.RuleStartingPos,LEN(R.RuleMsg)) = R.RuleMsg 
    AND M.ContrlNo = R.RuleNo 
GROUP BY M.ContrlNo) A 
LEFT JOIN ( 
    select COUNT(MsgLineNo) as TotalRules, RuleNo 
    from Rules R1 
    group by RuleNo) T 
    ON A.MatchedRules = T.TotalRules 
+0

选择A.ContrlNo,T.RuleNo FROM (选择ContrlNo,COUNT(R.RuleNo)作为MatchedRules FROM消息表中号 LEFT上M. [LINENO] = R.MsgLineNo 和M.Msg = R JOIN RuleTableř .RuleMsg GROUP BY M.ContrlNo)甲 LEFT JOIN( SELECT COUNT(MsgLineNo)作为TotalRules,从RuleTable R1 组RuleNo 由RuleNo)笔 ON A.MatchedRules = T.TotalRules用于我需要消息匹配做下面的事情,SUBSTRING(M.Msg,R.RuleStartingPos,LEN(R.RuleMsg))= R.RuleMsg我们需要得到最匹配的RuleNo foreach ContrlNo。 – Jay 2014-11-03 20:20:30

+0

@Jay,将该条件添加到子句中,它确实给出了最大匹配规则号。 – radar 2014-11-03 20:24:18

+0

谢谢....但我们无法比较M.ContrlNo = R.RuleNo ...他们完全不同 – Jay 2014-11-03 20:36:35