600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > mysql避免笛卡尔积_MYSQL:在自加入时避免重复记录的笛卡尔积

mysql避免笛卡尔积_MYSQL:在自加入时避免重复记录的笛卡尔积

时间:2023-02-04 13:12:05

相关推荐

mysql避免笛卡尔积_MYSQL:在自加入时避免重复记录的笛卡尔积

有两个表:表A和表B.它们具有相同的列,数据几乎相同.它们都具有自动递增的ID,两者之间的唯一区别是它们对于相同的记录具有不同的ID.

在这些列中,有一个IDENTIFIER列,它不是唯一的,即两个表中都有(非常少)具有相同IDENTIFIER的记录.

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

SELECT A.ID, B.ID

FROM A INNER JOIN B ON A.IDENTIFIER = B.IDENTIFIER

但是,由于IDENTIFIER非唯一,这会生成IDENTIFIER的重复值的所有可能组合,我不希望这样.

理想情况下,我希望根据订单生成具有重复IDENTIFIER值的ID之间的一对一关联.例如,假设表A中有六个具有不同ID和相同IDENTIFIER值的记录(因此在表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的顺序如何,生成一对一关联的方法仍然可以(但不是首选).

谢谢你的时间,

西尔维奥

最佳答案

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。