提问人:RKB 提问时间:2/11/2021 最后编辑:RKB 更新时间:2/11/2021 访问量:75
通过有条件地删除基于sql中其他一些coumn的具有相同列值的其他记录,根据列选择唯一记录
Select unique Records based on a column by conditionally removing the other record having same column value based on some other coumn in sql
问:
我正在开发一个 Android 应用程序,其中我正在使用 Room 持久性库。在其中一个表(房间实体)中,我有一个情况,我想通过有条件地删除基于其他列的具有相同列值的其他记录来选择基于列的唯一记录。
请考虑以下表作为基础。
S_ID | 地位 |
---|---|
1 | 待定 |
1 | 拒绝 |
3 | 批准 |
4 | 批准 |
5 | 待定 |
6 | 拒绝 |
7 | 拒绝 |
SQL 查询的预期结果,如果其S_ID与另一个“待处理”状态记录发生冲突,我希望从结果中删除具有 ' status 的记录Rejected'
S_ID | 地位 |
---|---|
1 | 待定 |
3 | 批准 |
4 | 批准 |
5 | 待定 |
6 | 拒绝 |
7 | 拒绝 |
到目前为止,我尝试过:
select DISTINCT s_id OR s_id = 0, * from TABLE1
答:
2赞
Parth M. Dave
2/11/2021
#1
我想你可以尝试下面的查询:
SELECT * FROM table1 WHERE table1.S_ID in (SELECT S_ID FROM table1 GROUP BY S_ID HAVING COUNT(S_ID)>0) and table1.[status]<>'Rejected'
编辑:
SELECT table1.S_ID,
(select Alias.[Status] from Table1 Alias where Alias.S_ID=table1.S_ID
and ((COUNT(table1.S_ID)>1 and Alias.[Status]<>'Rejected') or COUNT(table1.S_ID)=1)
) as [Status]
FROM table1 GROUP BY S_ID HAVING COUNT(S_ID)>0
评论
0赞
RKB
2/11/2021
谢谢你,但这返回的是删除所有“拒绝”记录的结果,我想要的只是省略那些S_ID与“待处理”状态记录冲突的“拒绝”记录。它应该在结果中返回其他“拒绝”记录。我已经编辑了我的问题,以便更清楚地了解结果。
0赞
Parth M. Dave
2/11/2021
您可以尝试以下查询:SELECT table1。S_ID,(选择别名。Status] 从 Table1 别名,其中 Alias.S_ID=table1。S_ID 和 ((COUNT(table1.S_ID)>1 和 Alias。[状态]<>'已拒绝') 或 COUNT(表 1.S_ID)=1) ) 作为 [状态] 从表 1 分组 按 S_ID 计数(S_ID)>0
0赞
RKB
2/11/2021
我使用了您编辑的查询,如下所示:SELECT * FROM table1 WHERE table1。S_ID (SELECT table1.S_ID,(选择别名。Status] 从 Table1 别名,其中 Alias.S_ID=table1。S_ID 和 ((COUNT(table1.S_ID)>1 和 Alias。[状态]<>'已拒绝') 或 COUNT(表 1.S_ID)=1) ) 作为 [状态] FROM table1 GROUP BY S_ID HAVING COUNT(S_ID)>0) ORDER BY STATUS = “Rejected” DESC 但这给出了 SQLITE_ERROR] SQL 错误或缺少数据库(滥用聚合函数 COUNT())
0赞
Parth M. Dave
2/11/2021
你只接受编辑过的查询?如下图所示:SELECT table1。S_ID,(选择别名。Status] 从 Table1 别名,其中 Alias.S_ID=table1。S_ID 和 ((COUNT(table1.S_ID)>1 和 Alias。[状态]<>'已拒绝') 或 COUNT(表 1.S_ID)=1) ) 作为 [状态] FROM table1 GROUP BY S_ID
1赞
Gordon Linoff
2/11/2021
#2
为此,您可以使用聚合:
select s_id, min(status) as status
from table_id
group by s_id;
这使用了按字母顺序排列的事实。max()
'Pending' < 'Rejecdted'
评论
0赞
RKB
2/11/2021
谢谢戈登,我使用了您的建议如下: SELECT * FROM table1 WHERE S_ID in (select s_id, min(status) as status from table1 group by s_id) ORDER BY status = \“Rejected\” DESC 但这给出了 SQL 错误(子选择返回 2 列 - 预期为 1)
0赞
Gordon Linoff
2/11/2021
@RKB . . .我建议的是答案中的代码。它解决了您提出的问题。
评论