MYSQL: Избегание декартового произведения повторяющихся записей при самостоятельном объединении - PullRequest
4 голосов
/ 27 августа 2010

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

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

Теперь, чтобы найти соответствие между идентификаторами таблицы A и идентификаторами таблицы B, Мне нужно объединить эти две таблицы (для всех целей это самостоятельное соединение) в ИДЕНТИФИКАТОРЕ. столбец, что-то вроде:

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

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

В идеале я бы хотел сгенерировать однозначную связь между идентификаторами, которые имеют повторяющиеся значения IDENTIFIER , на основе их порядка. Например, предположим, что в таблице A (и, следовательно, в таблице B) есть шесть записей с разными идентификаторами и одинаковым значением 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

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

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

Silvio

1 Ответ

2 голосов
/ 27 августа 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...