首页 > 解决方案 > 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 行相同。

但是第id1 行是单行的。

并且 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 ....;

标签: sqldatabaseselect

解决方案


您可以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);

聚合字符串的具体功能取决于数据库。


推荐阅读