sql - 识别一列中存在但另一列中不存在的不同代码
问题描述
我有如下表所示的数据。前两列是带有管道分隔符的国家代码列表。有两组 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
解决方案
你有一个可恶的数据结构。您应该将列表的元素存储为行上的单独值。但是您可以通过拆分值来做一些事情。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))
);
这不会是有效的。并且使用您拥有的数据结构,几乎没有提高性能的空间。
推荐阅读
- c# - Unity:拥有植被/草地的最有效方式(移动性能)?
- ajax - Ajax 用表单提交图片 - 传递 FormData - 触发提交
- javascript - Chrome/Safari/Firefox JavaScript 自动将日期格式更改为 DD-MM-YYYY 格式
- python - 从 protos 编译 grpc python 代码的问题
- sql - 根据标志列 Oracle SQL Developer 的总结果,(总和或减去某个值)
- android - 从 Android API 级别 28 应用程序调用本机函数
- python - 使用 .loc 的 Python Pandas 数据帧中的 KeyError
- angular - 显示隐藏成功失败警报
- javascript - 反应输入焦点事件以显示其他组件
- javascript - jQuery无法在移动设备上运行