Вернуть несколько строк, если условие удовлетворяет хотя бы одной строке

Я новичок в 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. s3 исключен по 3 причинам r5,r1 и r4.

Я могу отфильтровать приложение по SKU, Reason или обоим. Если я фильтрую по причине r1, он должен вернуть мне все SKU, которые исключены из-за r1, т.е. s1, s2, s3 в приведенном выше примере. Если я фильтрую по причине r1 и SKU s1, в настоящее время он возвращает мне s1 и r1 в результате, что я и хотел.

Теперь требование изменилось. Если я фильтрую по причине r1 для SKU s1, он должен не только возвращать мне s1 и r1, но и по другим причинам, из-за которых sku s1 исключается. т.е. он должен вернуть s1 r1, s1 r2, s1 r3. Однако, если я фильтрую по причине r5 для SKU s1, он ничего не должен возвращать, поскольку SKU s1 не исключается по причине r5.

Текущая реализация:

Критерии фильтра: Sku s1 и причина R1

SKU Reason
s1   r1

Я хочу изменить это на:

Критерии фильтра: Sku s1 и причина R1

SKU Reason
s1   r1
s1   r2
s1   r3

3 ответа

Вот полное решение с операторами выбора, чтобы опробовать все различные условия:

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 равно нулю).

Я думаю, что эту форму фильтра вы хотите построить:

    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 * from table where sku in (select sku from table where sku='s1' and reason='r1')
Другие вопросы по тегам