【问题标题】:Return multiple rows if condition satisfies for atleast one row如果条件满足至少一行,则返回多行
【发布时间】:2018-03-28 19:25:01
【问题描述】:

我是 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 或原因或两者过滤应用程序。如果我根据原因 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

【问题讨论】:

    标签: sql-server ssms ssms-2016


    【解决方案1】:

    这是一个完整的解决方案,其中包含用于尝试所有不同条件的 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 不为空,@param2 为空),我发现这些更容易阅读。

    【讨论】:

    • 我明白你在这里想要做什么。但是,我的 sku_filter 和 reason_filter 采用值列表而不是单个值。当我检查空值时,我的查询如何变化?现在,它看起来像 sku_filter IN (NULL),我不确定它是否是在值列表中检查 NULL 的正确方法
    【解决方案2】:
    select * from table where sku in (select sku from table where sku='s1' and reason='r1')
    

    【讨论】:

      【解决方案3】:

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

          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
          )
      

      【讨论】:

        猜你喜欢
        • 2014-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        • 2021-06-06
        • 1970-01-01
        • 2015-01-25
        • 1970-01-01
        相关资源
        最近更新 更多