SQL JOIN问题(还有一个)

时间:2010-10-07 23:31:34

标签: sql mysql

听起来很简单,但我被困了

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更快!!

2 个答案:

答案 0 :(得分:4)

表B中有两次33

SELECT DISTINCTGROUP 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时,它表示数据模型中存在问题。