5

テーブルAとテーブルBの2つのテーブルがあります。これらは同じ列を持ち、データは実質的に同じです。どちらも自動インクリメントされたIDを持っていますが、2つの違いは、同じレコードに対して異なるIDを持っていることだけです。

列の中には、一意ではないIDENTIFIER列があります。つまり、両方のテーブルに同じIDENTIFIERを持つレコードが(非常に少数)あります。

ここで、テーブルAのIDとテーブルBのIDの間の対応を見つけるために、次のようにIDENTIFIER列でこれら2つのテーブルを結合する必要があります(すべての目的で自己結合です)。

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

しかし、IDENTIFIERは一意ではないため、IDENTIFIERの繰り返し値の可能なすべての組み合わせが生成されるため、これは望ましくありません。

理想的には、IDENTIFIER値が繰り返されるID間で、その順序に基づいて1対1の関連付けを生成したいと思います。たとえば、テーブルA(したがってテーブルB)に異なるIDと同じIDENTIFIER値を持つ6つのレコードがあるとします。

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の順序に関係なく、1対1の関連付けを生成する方法は、引き続き問題ありません(ただし、推奨されません)。

御時間ありがとうございます、

シルヴィオ

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 に答える