2010-10-07 3 views
1

Звучит просто, но я застрялSQL JOIN вопрос (пока еще один)

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 

Я хочу РЕГИСТРИРУЙТЕСЬ таблицу А с Б:

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 значения с 33 в таблице B.

Что я хочу, это всего лишь одна запись с тем же значением в col_a. Как мне это сделать?

EDIT: Я обновляю дизайн таблиц, чтобы добавить больше столбцов, содержащих неидентичные данные, потому что они были такими, какими они задавали больше вопросов, чем решаемые проблемы. В любом случае, ответ на этот вопрос заключается в использовании GROUP BY, но штраф за производительность огромен, особенно на столе, который содержит более 50 миллионов записей (и растет). Однако лучший подход к решению моей проблемы состоял в том, чтобы использовать составной оператор (используя UNION ALL) для каждого отдельного значения в col_a. Преимущество производительности было x5 ~ x10 быстрее!

ответ

4

Вы 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) 
; 
+0

Обратите внимание на отсутствие 'INNER', поскольку' JOIN' сам по себе является 'INNER JOIN'. – vol7ron

+0

Подзапрос не рекомендуется и зависит от плана запроса базы данных. но если у вас есть ** много ** дубликатов записей из обеих таблиц (по какой-то ужасной причине), то подзапрос уменьшит задействованную работу. – vol7ron

+0

GROUP BY, похоже, делает трюк (хотя есть некоторые штрафные санкции)! –

2

Быстрый & грязный ответ:

select DISTINCT * from A inner join B on A.col_a = B.col_a 

Но вопрос в том, почему ты имеют две идентичные записи в таблице B?

Обычно, когда вы должны использовать DISTINCT, это указывает на проблему в вашей модели данных.

+0

Не все записи идентичны столбцу столбцу, потому что в таблицах A и B. имеется поле автоматического приращения.Это, в основном, приложение для ведения журнала, и фактическая проблема сложнее, но «дублирующие» записи неизбежны :(В любом случае использование DISTINCT * не помогает –

+0

@ Theo Zogrado: «Автоматический прирост искусственного первичного ключа вызывает дубликаты в реальной жизни» не является Новая история :( – onedaywhen