匹配过滤器

问题描述

我有两个表如下:

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 的转换。您可能实际上需要它们,但在问题中,值看起来像数字,并且问题没有指定它们存储为字符串。