Sql 查找至少两行,它们对应于具有不同值的相同id
查找同一客户端中至少有一个状态为1未删除行和一个状态为-1已删除行的行,如下所示: 状态=1表示未删除 state=-1表示已删除 e、 例如,输出将如下所示:Sql 查找至少两行,它们对应于具有不同值的相同id,sql,Sql,查找同一客户端中至少有一个状态为1未删除行和一个状态为-1已删除行的行,如下所示: 状态=1表示未删除 state=-1表示已删除 e、 例如,输出将如下所示: row_id client_id client_name state 1 10000 ABC Ltd. -1 2 10000 ABC Ltd. -1 3 10000 ABC Ltd. 1 4 20000
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
在这种情况下,不会显示客户端id 40000和50000,因为它们只有一条状态为1的记录,而没有任何相应状态为-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
)
您可以使用exists:
由于-1和1是唯一可能的值,您只需确保存在具有相同客户端id和不同状态的另一条记录。您可以按客户端id分组并计算不同的状态,以查看哪些客户端具有多个状态:
然后,如果需要查看原始表的结果,可以在CTE或子查询中使用:
SELECT A.*
FROM Table A
JOIN
(
SELECT client_id
FROM Table
GROUP BY client_id
HAVING COUNT(DISTINCT(state)) > 1
) B
ON A.client_id = B.client_id
ORDER BY A.row_id
Ms sql server和mysql是两种不同的产品,具有不同的sql实现。我删除了冲突的产品标签。请加上你实际使用的那个!
select * from tablename
where client_id in (
select client_id
from tablename
group by client_id
having min(state) = -1 and max(state) = 1
)
select t.*
from mytable t
where exists (
select 1 from mytable t1 where t1.client_id = t.client_id and t1.state <> t.state
)
SELECT client_id
from Table
GROUP BY client_id
HAVING COUNT(DISTINCT(state)) > 1
SELECT A.*
FROM Table A
JOIN
(
SELECT client_id
FROM Table
GROUP BY client_id
HAVING COUNT(DISTINCT(state)) > 1
) B
ON A.client_id = B.client_id
ORDER BY A.row_id