2010-08-27 1 views
4

Есть две таблицы: таблица A и таблица B. Они имеют одинаковые столбцы, и данные практически идентичны. Они оба имеют автоматически увеличивающиеся идентификаторы, единственное различие между ними состоит в том, что они имеют разные идентификаторы для тех же записей.MYSQL: Избегайте декартовых произведений повторяющихся записей при самосоединении

Среди столбцов есть столбец IDENTIFIER, который не является уникальным, то есть (очень мало) записей с тем же IDENTIFIER в обеих таблицах.

Теперь для того, чтобы найти соответствие между идентификаторами таблицы А и идентификаторы таблицы B, я должен соединить эти две таблицы (для всех целей это автообъединение) на колонке IDENTIFIER, что-то как:

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

Но, будучи IDENTIFIER неуникальным, это порождает все возможные комбинации повторяющихся значений IDENTIFIER, я не хочу этого.

В идеале я хотел бы генерировать 12:59 связь между идентификаторами, которые повторив IDENTIFIER значения, в зависимости от их порядка. Например, предположим, что существует шесть записей с разными ID и тем же значением идентификатора в таблице А (и, таким образом, в таблице В):

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 

Это было бы идеально. В любом случае способ создания взаимноопределенной ассоциации независимо от порядка идентификаторов будет по-прежнему в порядке (но не предпочтительнее).

Спасибо за ваше время,

Сильвио

+0

+1, так как вы меня в тупик ... – ircmaxell

ответ

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 
+0

+1 для реализации row_number() в MySQL –

 Смежные вопросы

  • Нет связанных вопросов^_^