查找至少两行对应于具有不同值的同一id

  • 本文关键字:于具 id 两行 查找 sql
  • 更新时间 :
  • 英文 :


查找同一客户端的那些行,其中至少有一行状态为1(未删除(,另一行状态是-1(已删除(,此处:

state=1表示未删除,

state=-1表示已删除

row_id  client_id  client_name   state 
1       10000      ABC Ltd.       -1
2       10000      ABC Ltd.       -1
3       10000      ABC Ltd.        1
4       20000      ABCDE Ltd.     -1
5       20000      ABCDE Ltd.     -1
6       20000      ABCDE Ltd.      1
7       30000      ABCDEFG Ltd.    1
8       30000      ABCDEFG Ltd.   -1
9       40000      ABCdefghi Ltd.  1
10      50000      XYZ Ltd.        1

例如,输出将类似于:

row_id  client_id  client_name   state 
1       10000      ABC Ltd.       -1
2       10000      ABC Ltd.       -1
3       10000      ABC Ltd.        1
4       20000      ABCDE Ltd.     -1
5       20000      ABCDE Ltd.     -1
6       20000      ABCDE Ltd.      1
7       30000      ABCDEFG Ltd.    1
8       30000      ABCDEFG Ltd.   -1

在这种情况下这里是client_id 40000&50000没有显示,因为它们只有一个状态为1的记录,而没有任何对应状态为-1的记录。

您可以使用exists:

select t.*
from mytable t
where exists (
select 1 from mytable t1 where t1.client_id = t.client_id and t1.state <> t.state
)

由于-11是唯一可能的值,您只需要确保存在具有相同client_id和不同state的另一条记录。

使用EXISTS:

select t.* from tablename t
where 
exists (select 1 from tablename where client_id = t.client_id and state = -1)
and
exists (select 1 from tablename where client_id = t.client_id and state = 1)

或者使用返回所有所需客户端id的子查询:

select * from tablename 
where client_id in (
select client_id
from tablename
group by client_id
having min(state) = -1 and max(state) = 1
)

最新更新