在过滤器的where子句中匹配多行
Posted
技术标签:
【中文标题】在过滤器的where子句中匹配多行【英文标题】:Matching multiple rows in where clause for filter 【发布时间】:2021-09-27 01:56:00 【问题描述】:我有两张表如下:
Table 1 : Product_Information
Information_ID | Product_Name |
---|---|
1 | A |
2 | B |
3 | C |
4 | D |
5 | E |
Table 2 : Discriptor_Values
Information_ID | Descriptor_ID | Descriptor_Value |
---|---|---|
1 | 1 | 98 |
1 | 2 | 142 |
1 | 3 | 29.66 |
2 | 1 | 50 |
2 | 2 | 11 |
2 | 3 | 14 |
3 | 1 | 17 |
3 | 2 | 76 |
3 | 3 | 85 |
4 | 1 | 59 |
4 | 2 | 48 |
4 | 3 | 35 |
5 | 1 | 48 |
5 | 2 | 12 |
5 | 3 | 19 |
使用上面的表格,我正在创建一个过滤器页面,就像在任何在线购物页面中一样,即手机的最小和最大价格范围,内部存储的最小和最大范围是描述符和值范围。 同样,我将选择描述符并为其提供最小值和最大值,匹配的产品将是结果。 如果我通过任何过滤范围,则将显示过滤后的产品列表,否则应显示所有记录。
我正在尝试以下查询,但没有得到正确的输出。我得到了与任何传递的行(#tblFilter)匹配的行的联合。
CREATE TABLE #tblFilter(
[descriptor_id] [int] NULL,
[min_value] [decimal](18, 0) NULL,
[max_value] [decimal](18, 0) NULL
)
insert into #tblFilter values (1, 40.33, 70.33)
insert into #tblFilter values (2, 100.33, 150.33)
insert into #tblFilter values (3, 10, 60)
select p.*
from Product_Information p
inner join Discriptor_Values dv on p.Information_ID = dv.Information_ID
left join #tblFilter t1 on t1.descriptor_id = dv.Descriptor_id
WHERE ((dv.Descriptor_ID = t1.descriptor_id
and convert(decimal, dv.Descriptor_Value)
between CONVERT(decimal, t1.min_value) and CONVERT(decimal, t1.max_value))
or not exists (select 1 from #tblFilter))
drop TABLE #tblFilter
请帮助我通过过滤器最小化结果列表,如果过滤器表(#tblFilter)中没有行,则显示所有记录。
【问题讨论】:
这能回答你的问题吗? Left Outer Join Not Working? @Charlieface 不,这个链接对我没有帮助。 【参考方案1】:我相信你想要:
select p.*
from Product_Information p join
Discriptor_Values dv
on p.Information_ID = dv.Information_ID left join
#tblFilter t1
on t1.descriptor_id = dv.Descriptor_id
where dv.Descriptor_Value between t1.min_value and t1.max_value or
dv.Descriptor_id is null;
我删除了对decimal
s 的转换。您可能实际上需要它们,但在问题中值看起来像数字,并且问题没有指定它们存储为字符串。
【讨论】:
我已经尝试过您的解决方案。它将所有记录作为输出。 @BholuBhaiya 。 . .您确定您使用的是正确的on
子句吗?以上是关于在过滤器的where子句中匹配多行的主要内容,如果未能解决你的问题,请参考以下文章
mysql过滤数据-------------------------待补充