问题描述
我有两个表如下:
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) 中没有行时显示所有记录。
解决方法
我相信你想要:
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
的转换。您可能实际上需要它们,但在问题中,值看起来像数字,并且问题没有指定它们存储为字符串。