Sql server 如果条件至少满足一行,则返回多行

Sql server 如果条件至少满足一行,则返回多行,sql-server,ssms,ssms-2016,Sql Server,Ssms,Ssms 2016,我是SSMS的新手,我觉得这应该很容易,但我不知道怎么做。为了简单起见,我重新命名了我的表 SKU Reason s1 r1 s1 r2 s1 r3 s2 r1 s2 r3 s3 r5 s3 r1 s3 r4 为了提供上下文,SKU“s1”被排除在外,原因有三:r1、r2、r3。s2被排除在外,原因有两个:r1和r3。由于r5、r1和r4三个原因,s3被排除在外 我可以根据SKU或原因或两者筛选应用程序。如果我根据原因r1进行筛选,它应返回因r1而排除的所有SKU,即上例中的s

我是SSMS的新手,我觉得这应该很容易,但我不知道怎么做。为了简单起见,我重新命名了我的表

SKU Reason
s1  r1
s1  r2
s1  r3
s2  r1
s2  r3
s3  r5
s3  r1
s3  r4
为了提供上下文,SKU“s1”被排除在外,原因有三:r1、r2、r3。s2被排除在外,原因有两个:r1和r3。由于r5、r1和r4三个原因,s3被排除在外

我可以根据SKU或原因或两者筛选应用程序。如果我根据原因r1进行筛选,它应返回因r1而排除的所有SKU,即上例中的s1、s2、s3。如果我根据原因r1和SKU s1进行筛选,那么它当前会在结果中返回我想要的s1和r1

现在,要求已经改变了。如果我根据SKU s1的原因r1进行筛选,它不仅应该返回s1和r1,还应该返回SKU s1被排除的其他原因。i、 它应该返回s1 r1、s1 r2、s1 r3。但是,如果我按原因r5筛选SKU s1,它将不返回任何内容,因为SKU s1未被原因r5排除

目前的执行情况:

筛选条件:Sku s1和原因R1

SKU Reason
s1   r1
SKU Reason
s1   r1
s1   r2
s1   r3
我想将其更改为:

筛选条件:Sku s1和原因R1

SKU Reason
s1   r1
SKU Reason
s1   r1
s1   r2
s1   r3

我认为您要构建的这种形式的过滤器:

    declare @sku varchar(50) = 's1'
    declare @reason varchar(50) = 'r1'

    SELECT * FROM TAB1 where (SKU=@sku ) 
    and exists (
    SELECT * FROM TAB1 where SKU=@sku AND Reason = @reason
    )

下面是一个完整的解决方案,其中包含select语句,可以尝试所有不同的条件:

declare @t table (sku varchar(2), reason varchar(2))
insert into @t values ('s1', 'r1')
insert into @t values ('s1', 'r2')
insert into @t values ('s1', 'r3')
insert into @t values ('s2', 'r1')
insert into @t values ('s2', 'r3')
insert into @t values ('s3', 'r5')
insert into @t values ('s3', 'r1')
insert into @t values ('s3', 'r4')

declare @sku_filter varchar(2)
declare @reason_filter varchar(2)
-- try each of these scenarios
select @sku_filter = 's1', @reason_filter = 'r1'
--select @sku_filter = 's1', @reason_filter = 'r5'
--select @sku_filter = null, @reason_filter = 'r1'
--select @sku_filter = 's1', @reason_filter = null
--select @sku_filter = null, @reason_filter = null

select sku, reason
from @t t
where (@sku_filter is not null and @reason_filter is not null and t.sku = @sku_filter and exists (select * from @t t where sku = @sku_filter and reason = @reason_filter))
or (@sku_filter is not null and @reason_filter is null and t.sku = @sku_filter)
or (@sku_filter is null and @reason_filter is not null and t.reason = @reason_filter)
or (@sku_filter is null and @reason_filter is null)

我发现,如果将条件组合在括号中(例如@param1不为null,@param2为null),阅读这些条件会容易得多。

我明白您在这里要做什么。但是,我的sku_筛选器和原因_筛选器接受一个值列表,而不是单个值。当我检查空值时,查询如何更改?现在,它看起来像sku_filter IN(NULL),我不确定这是否是在值列表中检查NULL的正确方法