首页 > 解决方案 > 识别一列中存在但另一列中不存在的不同代码

问题描述

我有如下表所示的数据。前两列是带有管道分隔符的国家代码列表。有两组 RANK 为 1 和 2 的行。我试图通过给定的 RANK 识别 CountryList1 中存在但 CountryList1 列中不存在的国家代码。对于 Rank 1 行,HN JP SK 和 KY 存在于 CountryList1 中,但不存在于 CountryList2 中。同样,对于 Rank 2 行。HN 存在于 CountryList1 中,但不存在于 CountryList2 中。我期待像第二张桌子一样的输出。我不想使用函数或过程,而是尝试使用 select 语句来完成它。

输入

CountryList1    || CountryList2 || RANK
================||==============||=======
HN|IN|US        || GB|CA|CH|CA  ||  1
JP|CH           || IN|US|LU     ||  1
HN|SK|KY        || GB|CA        ||  1
FI              || IN|MO        ||  1
HN|IN|US        || HN           ||  2
JP|CH           || CH|IN|US     ||  2
HN              || NO           ||  2

输出

DistinctCountry1    ||  RAN
====================||========  
HN                  ||  1   
JP                  ||  1   
SK                  ||  1   
KY                  ||  1   
JP                  ||  2   

标签: sqlsql-server

解决方案


你有一个可恶的数据结构。您应该将列表的元素存储为行上的单独值。但是您可以通过拆分值来做一些事情。SQL Server 2016 具有string_split(). 对于早期版本,您可以在网上找到一个。

with tc as (
      select t.*, s.country1
      from t cross apply
           (string_split(t.countrylist1, '|') s(country1) 
     )
select distinct t.country1, t.rnk
from tc
where not exists (select 1
                  from t t2
                  where tc.rnk = t2.rnk and
                        tc.country in (select value from string_split(t2.country_list))
                 );

这不会是有效的。并且使用您拥有的数据结构,几乎没有提高性能的空间。


推荐阅读