Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于同一表的两列进行筛选_Sql_Sql Server - Fatal编程技术网

Sql 基于同一表的两列进行筛选

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

我的表有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 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); 
简短的回答是“不”,您不需要使用光标。作为第一步,请查看是否可以编写查询来实现规则并返回要排除的行。如果你能做到这一点,那么最终的结果是非常容易的。