【发布时间】: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 不,这个链接对我没有帮助。
标签: sql sql-server tsql sql-server-2012