5

有两个表:表 A 和表 B。它们具有相同的列,并且数据实际上是相同的。它们都具有自动递增的 ID,两者之间的唯一区别是它们对于相同的记录具有不同的 ID。

在这些列中,有一个 IDENTIFIER 列不是唯一的,即两个表中有(非常少)具有相同 IDENTIFIER 的记录。

现在,为了找到表 A 的 ID 和表 B 的 ID 之间的对应关系,我必须在 IDENTIFIER 列上连接这两个表(出于所有目的,它是自连接),如下所示:

SELECT A.ID, B.ID
FROM A INNER JOIN B ON A.IDENTIFIER = B.IDENTIFIER

但是,由于 IDENTIFIER 不唯一,这会生成 IDENTIFIER 重复值的所有可能组合,我不希望这样。

理想情况下,我想根据它们的顺序在具有重复 IDENTIFIER 值的 ID 之间生成一对一的关联。例如,假设表 A(因此在表 B)中有 6 条 ID 不同但 IDENTIFIER 值相同的记录:

A                                 B
IDENTIFIER:'ident105', ID:10  ->  IDENTIFIER:'ident105', ID:3
IDENTIFIER:'ident105', ID:20  ->  IDENTIFIER:'ident105', ID:400
IDENTIFIER:'ident105', ID:23  ->  IDENTIFIER:'ident105', ID:420
IDENTIFIER:'ident105', ID:100 ->  IDENTIFIER:'ident105', ID:512
IDENTIFIER:'ident105', ID:120 ->  IDENTIFIER:'ident105', ID:513
IDENTIFIER:'ident105', ID:300 ->  IDENTIFIER:'ident105', ID:798

那将是理想的。无论如何,无论 ID 的顺序如何,一种生成一对一关联的方法仍然可以(但不是首选)。

谢谢你的时间,

西尔维奥

4

1 回答 1

2
select a_numbered.id, a_numbered.identifier, b_numbered.id from 
(
select a.*,
       case 
          when @identifier = a.identifier then @rownum := @rownum + 1
          else @rownum := 1
       end as rn,
       @identifier := a.identifier
  from a
  join (select @rownum := 0, @identifier := null) r
order by a.identifier

) a_numbered join (
select b.*,
       case 
          when @identifier = b.identifier then @rownum := @rownum + 1
          else @rownum := 1
       end as rn,
       @identifier := b.identifier
  from b
  join (select @rownum := 0, @identifier := null) r
order by b.identifier

) b_numbered 
on a_numbered.rn=b_numbered.rn and a_numbered.identifier=b_numbered.identifier
于 2010-08-27T17:02:10.990 回答