比较同一个表中的两行是否存在一列的相等性以及SQL中另一列组合的不等式

时间:2018-01-20 02:59:46

标签: mysql sql sql-server

我的数据库中有以下表格:

表名:INSURANCE TABLE

ID | Policy | Lon | Lat

1  | 34564  | 2.0 | 4.0 

2  | 67548  | 1.1 | 1.4

3  | 34564  | 1.8 | 9.4

4  | 98271  | 4.3 | 2.3

5  | 90198  | 5.6 | 4.5

6  | 98271  | 1.3 | 5.6

7  | 90198  | 5.6 | 4.5

8  | 34564  | 2.0 | 4.0

我正在寻找一个以下列方式返回结果集的SQL查询: 结果集包含那些具有Policy值等于至少另一行的行,但(Lon,Lat)组合的另一行值应该不同。

对于上表,我应该得到以下结果集:

1 | 34564 | 2.0 | 4.0 

3 | 34564 | 1.8 | 9.4

4 | 98271 | 4.3 | 2.3 

6 | 98271 | 1.3 | 5.6

我很感激如何撰写此查询的回复。

2 个答案:

答案 0 :(得分:0)

您可以使用exists

select t.*
from insurancetable t
where exists (select 1 from insurancetable t2 where t2.policy = t.policy and t2.id <> t.id);

编辑:

根据你的问题,ids应该没问题。但如果您愿意,可以使用lat和long:

select t.*
from insurancetable t
where exists (select 1
              from insurancetable t2
              where t2.policy = t.policy and
                    (t2.lat <> t.lat or t2.lon <> t.lon)
             );

答案 1 :(得分:0)

我认为这可以解决您的问题。

 select min(t1.id) as id, t1.Policy, t1.lon, t1.lat from INSURANCE t1
 inner join INSURANCE t2 on 
     t1.Policy = t2.Policy and t1.Id <> t2.Id 
 where t1.lat <> t2.lat or t1.lon <> t2.lon
 group by t1.Policy, t1.lon, t1.lat
 order by id

min(id)在重复的情况下获得第一个id。例如Id 1和Id 8.它将只获得Id 1。