2017-01-15 25 views
1
 
ID | Company | Type 
--- | -------- | ---- 
1 | *  | * 
2 | CMP1  | * 
3 | CMP1  | TYP1 
4 | *  | TYP1 
5 | *  | TYP2 
6 | CMP1  | TYP2 

(以下公司和类型一起,使主键。)如何从下表中获得最佳匹配结果?

我得从这个表中的精确匹配。我的不同输入是

 
Company | Type | OutPut 
----- | ----- | ------- 
CMP1  | TYP1 | 3 
CMP2  | TYP2 | 5 
CMP5  | TYP5 | 1 
如果公司与任何记录匹配,则获取该值,否则查找*值。 你如何得到这个?

(目前我确实循环每个领域,并通过最佳匹配分配一个分数,之后,我通过分数值得到前1分。)有没有简单的方法?

+0

您的示例中似乎缺少一个案例。如果在公司和通配符类型上有完全匹配,并且在公司类型和通配符匹配上有完全匹配,则会发生什么情况?哪一个会被视为“最佳匹配”? –

+0

是的,谢谢你的评论,在我的情况下,我更喜欢公司之一 –

回答

0

可以使用outer apply做到这一点:

select i.*, t1.id 
from inputs i outer apply 
    (select top 1 t1.* 
     from t1 
     where (t1.Company = '*' or t1.Compay = i.Company) or 
      (t1.Type = '*' or t1.Type = i.Type) 
     order by ((case when t1.company = '*' then 0 else 1 end) + 
       (case when t1.type = '*' then 0 else 1 end) 
       ) desc 
    ) t1; 
0
SELECT TOP 1 * 
FROM [test] 
ORDER BY 
     (CASE WHEN Company = @Company and Type = @Type THEN 1000 ELSE 0 END 
     + CASE WHEN Company = @Company and Type ='*' THEN 900 ELSE 1 END 
     + CASE WHEN Company = '*' and Type = @Type THEN 800 ELSE 2 END 
     + CASE WHEN Company = '*' and Type = '*' THEN 700 ELSE 3 END 
     ) DESC 
0

你可以尝试波纹管的解决方案:

DECLARE @Company2Type TABLE (
    ID  INT NOT NULL 
     UNIQUE NONCLUSTERED, 
    Company VARCHAR(50) NOT NULL, 
    [Type] VARCHAR(50) NOT NULL, 
     PRIMARY KEY CLUSTERED (Company, [Type])  
) 
INSERT @Company2Type 
VALUES 
(1, '*', '*'), 
(2, 'CMP1', '*'), 
(3, 'CMP1', 'TYP1'), 
(4, '*', 'TYP1'), 
(5, '*', 'TYP2'), 
(6, 'CMP1', 'TYP2'); 

DECLARE @TestData TABLE (
    Company VARCHAR(50) NOT NULL, 
    [Type] VARCHAR(50) NOT NULL 
) 
INSERT @TestData 
VALUES 
('CMP1' , 'TYP1'), 
('CMP2' , 'TYP2'), 
('CMP5' , 'TYP5'); 

SELECT *, COALESCE(rule1.ID, rule2.ID, rule3.ID, rule4.ID) AS [Output] 
FROM @TestData td 
OUTER APPLY (
    SELECT ct.ID 
    FROM @Company2Type ct 
    WHERE ct.Company = td.Company 
    AND  ct.[Type] = td.[Type] 
) rule1 
OUTER APPLY (
    SELECT ct.ID 
    FROM @Company2Type ct 
    WHERE rule1.ID IS NULL 
    AND  ct.Company = td.Company 
    AND  ct.[Type] = '*' 
) rule2 
OUTER APPLY (
    SELECT ct.ID 
    FROM @Company2Type ct 
    WHERE rule1.ID IS NULL 
    AND  ct.Company = '*' 
    AND  ct.[Type] = td.[Type] 
) rule3 
OUTER APPLY (
    SELECT ct.ID 
    FROM @Company2Type ct 
    WHERE rule1.ID IS NULL 
    AND  ct.Company = '*' 
    AND  ct.[Type] = '*' 
) rule4 

结果:

Company Type ID ID ID ID Output 
------- ---- ---- ---- ---- ---- ------ 
CMP1 TYP1 3 NULL NULL NULL 3 
CMP2 TYP2 NULL NULL 5 1 5 
CMP5 TYP5 NULL NULL NULL 1 1 

注:

  • [规则1]这两家公司和类型匹配
  • [规则2]公司匹配和测试类型相匹配*
  • [规则3]测试公司*一致和类型匹配
  • [Rule4]这两家公司和类型匹配*
相关问题