匹配不同列上的记录

dgenwo3n  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(400)

我必须根据不同数量的匹配列将一个代理表与一个表客户机相匹配,有些匹配所有列,有些只匹配一个或两个或三个;而不是相同的列。示例:
clients表有列 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个字段与一个代理匹配,则它们将被视为“通配符”,并被视为与相应代理匹配。
如何创建与每个客户机和代理匹配的视图?并显示没有相应代理的任何客户端,如上面的客户端05?
到目前为止,我所能想到的只是创建某种表,并在3或4个步骤中附加记录,但这是如此混乱和笨拙,并将另一个表添加到混合中。
我尝试了一个coalesce语句,并用like语句和周围的带%的字段连接起来,但是我尝试过的都没有给出有效的结果。
这需要临时表还是cte?或者别的什么?我卡住了!
有什么想法吗?

wribegjk

wribegjk1#

我认为你想要:

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 , country 以及 office ,同时允许 null 中的值 agents(country, office) . 当联接未找到匹配项时,列 agentIDnull 在结果集中。
请注意,根据您的数据,此技术可能会导致重复 clients 结果集中的行。

fslejnso

fslejnso2#

我想你想要最好的搭配 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;

相关问题