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

在列中,有一个标识符列,该列不是唯一的, ,即两个表中都有相同标识符的记录(很少)。

现在,为了找到表A的ID和表B的ID之间的对应关系, 我必须加入这两个桌子 (出于所有目的,这是一个自加入)在标识符列上,类似:

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

但是,作为标识符是非唯一的,这会生成标识符重复值的所有可能组合,我不想要它。

理想情况下,我想 在具有重复标识符值的ID之间生成一对一的关联, ,根据他们的命令。例如,假设表A中有六个具有不同ID和相同标识符值的记录(在表B中):

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

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

谢谢你的时间,

西尔维奥

有帮助吗?

解决方案

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top