sql - SQL有没有办法选择相同列不相似的行
问题描述
SQL 有没有办法选择相同列不相似的行。
我有这个表 City_Names
数据库名称DataPostalCode
id |AR |HB |ENG
---+----------+----------+-----------
1 |valueAR |valueHB |valueENG
---+----------+----------+-----------
2 |TamraAR |TamraHB |TamraENG
---+----------+----------+-----------
3 |TamraAR |Tamra2HB |TamraENG
---+----------+----------+-----------
4 |KabulAR |KabulHB |KabulENG
---+----------+----------+-----------
6 |KabulAR |KabulHB |KabulENG
---+----------+----------+-----------
7 |KabulAR |KabulHB |KabulENG
---+----------+----------+-----------
8 |Azor |Azor |Azor
---+----------+----------+-----------
9 |Azor |Azor |Azor
---+----------+----------+-----------
...
以上数据仅为演示,并非真实数据。
请参阅id
第 4 行和第 6 行以及第 7 行的 AR+HB+ENG 具有相似的值。
第 8行id
和第 9 行相同。
但是第id
1 行是单行的。
并且 id
第 2 行和第 3 行(我正在寻找的)与 AR+ENG 相似,但 HB 列不相似。
所以我训练编写sql代码来选择那些不相似的行,结果应该是。
id |AR |HB |ENG
---+----------+----------+-----------
2 |TamraAR |TamraHB |TamraENG
---+----------+----------+-----------
3 |TamraAR |Tamra2HB |TamraENG
---+----------+----------+-----------
我应该写什么?
SELECT id,AR,HB,ENG FROM City_Names ....;
解决方案
您可以exists
为此使用:
select cn.*
from city_names cn
where exists (select 1
from city_names cn2
where cn2.ar = cn.ar and
cn2.eng = cn.eng and
cn2.hb <> cn.hb
);
如果您愿意,也可以将其减少到单行。确切的语法取决于数据库:
select cn.ar, cn.eng,
list_agg(cn.id, ',') over (order by id) as ids,
list_agg(cn.hb, ',') over (order by id) as hbs
from city_names cn
group by cn.ar, cn.eng
having min(cn.hb) <> max(cn.hb);
聚合字符串的具体功能取决于数据库。
推荐阅读
- android - 将新通知添加到组时,Android会删除组通知中的通知数据
- batch-file - java.io.IOException: 批处理脚本只能在 Windows 节点上运行 ::: 使用 jenkins - MacOSX
- swift - 我不确定我的 UICollectionView 做错了什么
- wpf - Wpf DataGrid ToolTip for column headers
- java - 为什么不能使用 super 关键字引用接口变量
- amazon-web-services - 在 AWS 中 - 带有 SSL 证书的子域在 RESTful 调用中不起作用
- ios - 为什么通用链接适用于 iOS 12,但不适用于 iOS 13?
- typescript - NestJs + TypeORM 注入的存储库变得未定义
- aws-lambda - Amplify Function 的模拟环境变量
- wordpress - 一个 EC2 实例 (AWS) 下的多个 WordPress 多站点