我在下面有category
表:
id min max
1 0 1000
2 1001 20000
3 20001 1000000000
和data
表格如下:
id weight
1 1000
2 500
3 2000
4 5000
5 20000
6 200
7 100
8 25000
9 18000
10 26000
我想创建一个视图,显示数据属于这样的类别:
data.id category.id
1 1
2 1
3 2
4 1
5 2
6 1
7 1
8 3
9 2
10 3
如果有重复的类别符合条件,则只显示最低category.id
。
规则:
category.id = SELECT TOP(1) id FROM category WHERE @data.weight BETWEEN min AND max
仅使用没有存储过程的视图可以做到这一点吗?
答案 0 :(得分:4)
这可以通过连接或相关子查询来完成,也可以使用apply
作为注释中建议的TcK来完成。以下是查询的连接和相关子查询版本:
declare @category table (id int not null,min int not null,max int not null)
insert into @category(id,min,max) values
(1,0 ,1000 ),
(2,1001 ,20000 ),
(3,20001,1000000000 )
declare @data table (id int not null,weight int not null)
insert into @data(id,weight) values
(1 ,1000 ),
(2 ,500 ),
(3 ,2000 ),
(4 ,5000 ),
(5 ,20000 ),
(6 ,200 ),
(7 ,100 ),
(8 ,25000 ),
(9 ,18000 ),
(10,26000 )
select d.id,MIN(c.id) as category_id
from @data d
inner join
@category c
on
d.weight between c.min and c.max
group by d.id
select d.id,(select MIN(c.id) from @category c
where c.min <= d.weight and c.max >= d.weight) as category_id
from @data d
我使用表变量只是为了简化脚本。 between
和显式比较之间的选择也是任意的,可以在任一查询中使用。如果范围是半开放的(包括最小值,独占最大值相当普遍),则需要显式比较变量。
结果:
id category_id
----------- -----------
1 1
2 1
3 2
4 2
5 2
6 1
7 1
8 3
9 2
10 3