1

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

SKU Reason
s1  r1
s1  r2
s1  r3
s2  r1
s2  r3
s3  r5
s3  r1
s3  r4

给出一个上下文,由于三个原因,SKU 's1' 被排除在外:r1、r2、r3。由于 r1 和 r3 两个原因,s2 被排除在外。由于 r5、r1 和 r4 三个原因,s3 被排除在外。

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

现在,需求变了。如果我根据 SKU s1 的原因 r1 进行过滤,它不仅应该返回我 s1 和 r1,还应该返回其他原因,因为 sku s1 被排除在外。即它应该返回s1 r1、s1 r2、s1 r3。但是,如果我按原因 r5 过滤 SKU s1,它应该不返回任何内容,因为原因 r5 不排除 SKU s1。

当前实施:

筛选条件:Sku s1 和原因 R1

SKU Reason
s1   r1

我想将其更改为:

筛选条件:Sku s1 和原因 R1

SKU Reason
s1   r1
s1   r2
s1   r3
4

3 回答 3

1

这是一个完整的解决方案,其中包含选择语句来尝试所有不同的条件:

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 不为空,@param2 为空)。

于 2018-03-28T19:38:44.280 回答
0
select * from table where sku in (select sku from table where sku='s1' and reason='r1')
于 2018-03-28T19:30:01.267 回答
0

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

    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
    )
于 2018-03-28T19:30:31.273 回答