你好我需要解决这类问题的方法:
样品: tblPeople:
- id Value carColor
1. Pid1 boy1 blue
2. Pid2 boy2 blue
3. Pid3 boy3 blue
4. Pid4 girl1 red
5. Pid5 girl2 red
tblCars:
- id Value
1. Cid1 blue
2. Cid2 blue
3. Cid3 red
4. Cid4 red
5. Cid5 red
条件: - 男孩只能使用蓝色车而女孩只能使用红色 - 人们只能使用1辆车,仅适合1人使用
在人与人之间分发汽车
预期结果:
1. Pid1 boy1 Cid1 blue
2. Pid2 boy2 Cid2 blue
3. Pid3 boy3 (no enough blue car - skipping)
4. Pid4 girl1 Cid3 red
5. Pid5 girl2 Cid4 red
或
1. Pid1 boy1 Cid2 blue
2. Pid2 boy2 Cid1 blue
3. Pid3 boy3 (no enough blue car - skipping)
4. Pid4 girl1 Cid5 red
5. Pid5 girl2 Cid3 red
现在我在循环加入时使用选择顶部1并标记所选记录以在下一次匹配中删除它,但这需要很多时间......
任何人都可以帮忙吗? 感谢
答案 0 :(得分:1)
您可以通过枚举汽车并枚举人员,然后执行join
来完成此操作:
select p.*, c.*
from (select p.*,
row_number() over (partition by gender order by gender) as seqnum
from tblPeople p
) p left join
(select c.*,
row_number() over (partition by color order by color) as seqnum
from cars c
) c
on p.seqnum = c.seqnum and
( (p.gender = 'boy' and c.color = 'blue') or
(p.gender = 'girl' and c.color = 'red')
) ;
这应该比你当前的方法快得多。
注意:如果要在每次运行查询时随机化分配,可以使用newid()
进行排序。