sql一对一加入/匹配

时间:2017-03-30 21:21:08

标签: sql sql-server tsql join

你好我需要解决这类问题的方法:

样品: 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并标记所选记录以在下一次匹配中删除它,但这需要很多时间......

任何人都可以帮忙吗? 感谢

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()进行排序。