查看两个表没有关键关系

时间:2017-07-18 06:53:38

标签: sql-server

我在下面有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

仅使用没有存储过程的视图可以做到这一点吗?

1 个答案:

答案 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