Sql server 如果条件至少满足一行,则返回多行
我是SSMS的新手,我觉得这应该很容易,但我不知道怎么做。为了简单起见,我重新命名了我的表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
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的正确方法