求高手给出解决方案或SQL语句。
现在有M个市场,每个市场有不同的经营类型(例如:卖电器的,卖食品的,等等),每个市场有N个摊位,每个摊位都有相对应的摊位号(每个市场的摊位号都是从1开始的到N),还有L个商户,也知道每个商户的经营类型,现在需要把这L个商户随机的安排到这M个市场中。
1:卖电器的安排到卖电器的市场,卖食品的商户安排到卖食品的市场
2:也可能有多个市场都是经营一种类型的商品
3:当然经营同一类型的市场摊位容量可能大于经营此类商品的商户总量,也有可能小于经营此类商品的商户总量(当摊位小于商户总量时,多出来的商户是不需要安排摊位)
4:安排摊位时,都从摊位容量最多的开始安排
5:另外不允许经营同一类型商品的市场摊位没有安排满,就排其他的经营此类商品的市场摊位(宁可空着)
表结构:
市场表表名:A
create table A(
市场ID int IDENTITY(1,1) NOT NULL,
市场名称 varchar(50),
摊位最大容量 int,
经营类型 varchar(20)
)
商户表表名:B
create table B(
商户ID int IDENTITY(1,1) NOT NULL,
商户名称 varchar(50),
经营类型 varchar(20)
)
市场摊位表:C
create table C(
市场ID int,
摊位号 int,
商户ID int
)
--初始数据
市场表A中
市场ID 市场名称 摊位最大容量 经营类型
1 天字一号 310 电器
2 天字二号 40 电器
3 月来一号 20 纺织品
4 NewB三号 900 化妆品
5 神州十号 10 航天器材
......等等。M条数据
商户表B中
商户ID 商户名称 经营类型
1 王老五 航天器材
2 李万 电器
3 不诗人 纺织品
4 牛笨 纺织品
......等等。L条数据
需要的结果是:
根据以上规则向 市场摊位表C 中填入数据,希望不要用动态SQL语句,另外也不要用游标。
我现在的作法:
1:用游标打开市场表,开始循环所有市场
2:新建临时表
create table #C(
市场ID int,
摊位号 int IDENTITY(1,1) NOT NULL,
商户ID int
)
3:根据市场经营类型找到相对应的商户插入到#C,然后再在 insert into C select * from #C
其中使用了临时表#C中的自动增量ID来做摊位号。
现在A表数据大约有2000多行,B表数据有50万行左右,结果执行很慢,问了好多人,都说是游标影响的。求高手给出解决的方案或SQL语句。谢谢
------解决方案--------------------try:
select
m.市场ID,(n.Num-m.Num+m.摊位最大容量),n.商户ID
from
(select
a.*,sum(b.摊位最大容量) as Num
from
市场表 a,市场表 b
where
a.经营类型=b.经营类型
and
a.市场ID> =b.市场ID
group by
a.市场ID,a.市场名称,a.摊位最大容量,a.经营类型) m,
(select
a.*,count(b.id) as Num
from
商户表 a,商户表 b
where
a.商户ID> =b.商户ID
and
a.经营类型=b.经营类型
group by
a.商户ID,a.商户名称,a.经营类型) n
where
m.经营类型=n.经营类型 and n.Num between ((m.Num-m.摊位最大容量+1) and m.Num)
------解决方案--------------------上面的大哥,不要这快好嘛?想升个XX都不易啊~