匹配不同列的记录

问题描述 投票:-1回答:1

我必须匹配一个表格 代理商 列表 客户 根据不同的匹配列数,有的在所有列上都匹配,有的只在一列上匹配,或两列、三列上匹配;而且不是同一列。举例说明。

客户 表有列

ClientID, System, Country, Office

示例数据。

01   ABC   US   CT
02   ABC   US   RI
03   ABC   US   MA
04   DEF   US   AZ
04   GHI   CA   PQ
05   ABC   ZZ   ZZ

代理商 表有列

AgentID, System, Country, Office

示例数据。

A1   ABC   US   CT
A2   ABC        RI
A3   ABC   US   MA
B1   DEF   US   
B2   GHI      

问题: 代理商 拥有 体系 价值,但有些 代理商 没有价值的 国家办公室有的仅有 体系有的已经 体系国家有的已经 体系办公室,其余的都有3个。系统, 国家办公室. 如果一个 客户 只匹配1或2个字段到一个 代理商,它们被视为 "通配符",并被认为与相应的 代理商.

如何创建一个匹配每个客户和代理的视图?并显示任何有 没有 对应的Agent,比如上面的客户端05?

到目前为止,我所能想到的就是建立某种表,然后分3、4步追加记录,但这样做太乱太笨拙了,而且又增加了一张表。

我试过一个 COALESCE 声明,并加入 喜欢 语句和周围的字段用 %但我试过的所有方法都没有得到有效的结果。

这是否需要一个温度表或一个 CTE? 还是什么?我卡住了!

有什么好办法吗?

sql sql-server view
1个回答
1
投票

我想,你想要的。

create view v_clients_agents as
select c.*, a.agentID
from clients c
left join agents a 
    on a.system = c.system
    and (a.country is null or a.country = c.country)
    and (a.office  is null or a.office  = c.office)

这个尝试将两张表连接在一起 system, countryoffice同时允许 null 值在 agents(country, office). 当连接没有找到匹配的对象时,列中的 agentIDnull 的结果集。

注意,根据您的数据,这种技术可能会导致重复的 clients 结果集中的行。


1
投票

我想你想要最好的匹配,用 NULL 值作为通配符。 如果是,那么 apply 才是王道。

select a.*, a.agentid
from clients c outer apply
     (select top (1) a.*
      from agents a
      where (a.System = c.system or a.System is null) and
            (a.Country = c.Country or a.Country is null) and
            (a.Office = c.Office or a.Office is null)
      order by (case when a.system = c.system then 1 else 0 end) +
               (case when a.Country = c.Country then 1 else 0 end) +
               (case when a.Office = c.Office then 1 else 0 end) desc
     ) a;
© www.soinside.com 2019 - 2024. All rights reserved.