Вернуть несколько строк, если условие удовлетворяет хотя бы одной строке
Я новичок в 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')