Sql 查找匹配的记录集

Sql 查找匹配的记录集,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我在SQL Server 2008R2上有以下表格 消息表 规则表 对于MESSAGETABLE中的每组ControlNo记录,我希望应用RULETABLE中的规则,并列出RULENo(如果有) 如果您看到RuleTable,则规则2与规则1重叠。要求是为每个控制编号获得最匹配的RuleNo。预期结果是, ContrlNo | RuleNo 1 | 1 2 | 2 3 | NULL 谢谢, Jay第一个子查询得到的是完全匹配的规则,第二个子查询得到的是完全匹配的规则

我在SQL Server 2008R2上有以下表格

消息表

规则表

对于MESSAGETABLE中的每组ControlNo记录,我希望应用RULETABLE中的规则,并列出RULENo(如果有)

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

ContrlNo | RuleNo
1   |   1 
2   |   2 
3   |   NULL
谢谢,
Jay

第一个子查询得到的是完全匹配的规则,第二个子查询得到的是完全匹配的规则,当这两个条件匹配时,我们将显示规则No other wise NULL,因为我们使用的是左连接


我相信以下内容将检索列出的结果:它将显示一个控制编号和关联规则,该规则具有最多匹配行。如果与第一种情况一样,两个规则的匹配数相等,它将检查匹配百分比

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

我不明白你预期结果背后的逻辑。您能更详细地解释一下吗?我们需要获取每个ContrlNo的所有记录SLINENO,Msg,并将其与RuleTableMsgLineNo,RuleMsg进行匹配。例如,如果我们从MessageTable中获取属于ContrlNo 1的记录,并将其与RuleTable进行匹配,则RuleNo 1将100%匹配。但是规则2有两个条件,规则2的第二个条件不匹配。结果是,控制规则1。如果我们从MessageTable中获取属于ContrlNo 2的记录并将其与RuleTable匹配,则RuleNo 1将100%匹配。但是规则2有两个条件,它们都是100%匹配的。因为我们需要最大匹配规则,所以在本例中,结果是ContrlNo | RuleNo2 | 2。@Jay,我给出的查询是否适用于您?从Select ContrlNo中选择A.ContrlNo,T.RuleNo,从MessageTable M中选择COUNTR.RuleNo作为匹配规则左连接M上的规则表R。[LineNo]=R.MsgLineNo和M.Msg=R.RuleMsg GROUP BY M.ContrlNo A LEFT JOIN选择COUNTMsgLineNo作为TotalRules,RuleNo从RuleTable R1 GROUP BY RuleNo T按A.MatchedRules=T.TotalRules匹配消息我需要执行以下操作,SUBSTRINGM.Msg,R.RuleStartingPos,LENR.RuleMsg=R.RuleMsg我们需要为每个控件获取最匹配的RuleNo。@Jay,在子句中添加了该条件,它确实给出了最大匹配的规则no。谢谢。。。。但是我们不能比较M.ContrlNo=R.RuleNo。。。他们完全不同
ContrlNo | RuleNo
1   |   1 
2   |   2 
3   |   NULL
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
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