查找同一客户端的那些行,其中至少有一行状态为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
)
由于-1
和1
是唯一可能的值,您只需要确保存在具有相同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
)