sql一对一联接/匹配
您好,我需要这类问题的解决方案: 样本: TBL人员:sql一对一联接/匹配,sql,sql-server,tsql,join,Sql,Sql Server,Tsql,Join,您好,我需要这类问题的解决方案: 样本: TBL人员: - id Value carColor 1. Pid1 boy1 blue 2. Pid2 boy2 blue 3. Pid3 boy3 blue 4. Pid4 girl1 red 5. Pid5 girl2 red TBLCAR: - id Value 1. Cid1 blue 2. Cid2 blue 3. Cid3 red 4. Cid4 red 5. Cid5 red
- id Value carColor
1. Pid1 boy1 blue
2. Pid2 boy2 blue
3. Pid3 boy3 blue
4. Pid4 girl1 red
5. Pid5 girl2 red
TBLCAR:
- id Value
1. Cid1 blue
2. Cid2 blue
3. Cid3 red
4. Cid4 red
5. Cid5 red
条件:
-男孩只能使用蓝色汽车,但女孩只能使用红色汽车
-人们只能使用一辆车,一辆车只能容纳一个人
在人与人之间分配汽车
预期结果:
或
现在,我正在使用连接周期中的select top 1标记所选记录,以便在下次匹配时删除它,但这需要很多时间
有人能帮忙吗?
谢谢你可以通过列举汽车和人群,然后进行加入:
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()
进行排序。一个按性别划分的简单行号(我假设您有一个列)和一个按颜色划分的行号将使这一操作变得非常简单,TBLPeope-updated我将此作为一条评论,闪电般的Gordon打印出了解决方案。:)很抱歉我的误解,但我看不到有条件的链接,男孩开蓝色的车,女孩开红色的车。。。。。请解释一下,是的,我在tblPeople(现在更新)@OleksiyKustlyvy中有carColor字段和color值。哎呀,这个条件也很重要。
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
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')
) ;