sql一对一联接/匹配

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

您好,我需要这类问题的解决方案:

样本: 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
条件: -男孩只能使用蓝色汽车,但女孩只能使用红色汽车 -人们只能使用一辆车,一辆车只能容纳一个人

在人与人之间分配汽车

预期结果:

现在,我正在使用连接周期中的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')
        ) ;