Вы можете попробовать сильфона решение:
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
Примечания:
- [Rule1] Обе компании и типы соответствия
- [Rule2] Компании соответствует и тип испытаний соответствует *
- [Rule3] Тест компании соответствует * и типы соответствия
- [Rule4] Обе компании и типы соответствия *
В вашем примере отсутствует случай. Что произойдет, если есть одна строка с точным совпадением в компании и подстановочный знак по типу, а другая с точным соответствием по типу и подстановочному совпадению на компании? Что будет считаться «лучшим матчем»? –
Да, спасибо за комментарий, В моем случае я предпочитаю компанию один –