2010-08-27 81 views
4

有兩個表:表A和表B.它們具有相同的列和數據幾乎相同。它們都具有自動遞增的ID,兩者之間的唯一區別是它們對於相同的記錄具有不同的ID。MYSQL:自動加入時避免重複記錄的笛卡爾積

其中列中有一個IDENTIFIER列,它不是唯一的,即在兩個表中都有(很少)具有相同IDENTIFIER的記錄。

現在,爲了找到表A的ID和表B的ID之間的對應關係,我必須在IDENTIFIER列上加入這兩個表(出於所有目的,它是自聯接),某些像:

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

但是,作爲標識符不唯一的,這會產生標識符的重複值的每一個可能的組合,我不希望出現這種情況。

理想情況下,我想生成ID之間的一對一的相關,已重複標識符值,基於它們的順序上。例如,假定有六個記錄與不同的ID和在表A(在表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 

這將是理想的。 無論如何,無論ID的順序如何生成一對一關聯的方式仍然可以(但不是首選)。

感謝您的時間,

西爾維奧

+0

+1,因爲你中有我難倒... – ircmaxell 2010-08-27 16:25:18

回答

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 mysql中實現ROW_NUMBER的() – 2010-08-27 19:45:44