听起来很简单,但我被困了
Table A Table B
col_a col_b col_a col_c
1 b 1 c
2 c 2 d
3 z 3 a
4 d 4 e
33 a 5 k
6 l
33 b
33 b
我想用B加入表A:
select * from A inner join B on A.col_a = B.col_a
我希望得到5条记录。
Expected join result ** Actual result **
col_a col_b col_c col_x[n]... col_a col_b col_c col_y[n]...
1 b c ... 1 b c ...
2 c d ... 2 c d ...
3 z a ... 3 z a ...
4 d e ... 4 d e ...
33 a b ... 33 a b ...
33 a b ...
为什么MySQL匹配33两次?因为它们是2个值,表B中有33个。
我想要的只是一条在col_a中具有相同值的记录。我该怎么做?
编辑:我正在更新表格的设计,以包含更多包含不相同数据的列,因为它们构成了比解决问题更多的问题。无论如何,答案是使用GROUP BY,但性能损失是巨大的,特别是在包含超过5000万条记录(并且正在增长)的表格上。 但是,解决我的问题的最佳方法是对col_a中的每个不同值使用复合语句(使用UNION ALL)。性能优势是x5~x10更快!!
答案 0 :(得分:4)
表B中有两次33
。
SELECT DISTINCT
或GROUP BY col_a, ...
:
SELECT DISTINCT *
FROM A
JOIN B ON ( A.col_a = B.col_a )
;
或
SELECT *
FROM A
JOIN B ON ( A.col_a = B.col_a )
GROUP BY col_a, col_b, col_c
;
但是你应该清理那张桌子。 根据重复行的出现次数,使用子查询可能会更快:
SELECT *
FROM A
JOIN (select distinct * from B) AS C
ON ( A.col_a = C.col_a )
;
答案 1 :(得分:2)
快速&肮脏的回答是:
select DISTINCT * from A inner join B on A.col_a = B.col_a
但真正的问题是,为什么表B中有两个相同的条目?
通常,当您必须使用DISTINCT时,它表示数据模型中存在问题。