Sql 基于同一表的两列进行筛选
我的表有4列,由两个组分隔Sql 基于同一表的两列进行筛选,sql,sql-server,Sql,Sql Server,我的表有4列,由两个组分隔(ID\u PROCESSO,ID\u INSTANCIA\u BPM)和(ID\u INSTANCIA\u BPM\u PAI,ID\u PROCESSO\u PAI) 如果第二组(ID\u INSTANCIA\u BPM\u PAI和ID\u PROCESSO\u PAI)为null,并且此记录的第一组不作为ID\u PROCESSO==ID\u PROCESSO\u PAI的记录的第二组出现,则必须返回它 如果第二组(ID\u INSTANCIA\u BPM\u
(ID\u PROCESSO,ID\u INSTANCIA\u BPM)
和(ID\u INSTANCIA\u BPM\u PAI,ID\u PROCESSO\u PAI)
如果第二组(ID\u INSTANCIA\u BPM\u PAI和ID\u PROCESSO\u PAI)
为null
,并且此记录的第一组不作为ID\u PROCESSO==ID\u PROCESSO\u PAI
的记录的第二组出现,则必须返回它
如果第二组(ID\u INSTANCIA\u BPM\u PAI和ID\u PROCESSO\u PAI)
为非空
和ID\u PROCESSO\u PAI
,则必须返回该组
对于SQLFIDLE示例,返回应该遵守如下规则
#|ID_PROCESSO|ID_INSTANCIA_BPM|ID_INSTANCIA_BPM_PAI|ID_PROCESSO_PAI
1 3 2957 (null) (null) --Returned
2 5 2958 2957 3 --Returned
3 4 2960 (null) (null) --Returned
4 4 2975 (null) (null) --Returned
5 3 2976 (null) (null) --Removed by #10
6 3 2977 (null) (null) --Removed by #9
7 5 2978 2977 3 --Removed by #8
8 5 2979 2978 5 --Returned
9 3 2980 2977 3 --Returned
10 3 2981 2976 3 --Returned
11 4 2984 (null) (null) --Returned
因此,结果必须是:
#|ID_PROCESSO|ID_INSTANCIA_BPM|ID_INSTANCIA_BPM_PAI|ID_PROCESSO_PAI
1 3 2957 (null) (null) --Returned
2 5 2958 2957 3 --Returned
3 4 2960 (null) (null) --Returned
4 4 2975 (null) (null) --Returned
8 5 2979 2978 5 --Returned
9 3 2980 2977 3 --Returned
10 3 2981 2976 3 --Returned
11 4 2984 (null) (null) --Returned
有人知道这是否只有通过选择才能实现,或者我需要一个光标来实现这一结果吗?如果我理解你的意思是正确的
select *
from processes p1
where (p1.ID_INSTANCIA_BPM_PAI is null AND p1.ID_PROCESSO_PAI is null
and
not exists (select *
from processes p2
where p2.ID_INSTANCIA_BPM_PAI = p1.ID_INSTANCIA_BPM
and p2.ID_PROCESSO_PAI = p1.ID_PROCESSO
and p2.ID_PROCESSO = p1.ID_PROCESSO)
)
or
(p1.ID_INSTANCIA_BPM_PAI is not null AND ID_PROCESSO_PAI is not null
and
not exists (select *
from processes p2
where p2.ID_INSTANCIA_BPM_PAI = p1.ID_INSTANCIA_BPM
and p2.ID_PROCESSO_PAI = p1.ID_PROCESSO
)
)
在SQLFIDLE上的输入行中,您遗漏了1行:
insert into processes values (5, '2979', '2978', 5);
简短的回答是“不”,您不需要使用光标。作为第一步,请查看是否可以编写查询来实现规则并返回要排除的行。如果你能做到这一点,那么最终的结果是非常容易的。