INNER JOIN в MySQL возвращает несколько записей в одной строке

0

Я использую MySQL через R. Я работаю с двумя таблицами в одной базе данных, и я заметил что-то странное, что я не могу объяснить. Чтобы быть более конкретным, когда я пытаюсь установить соединение между таблицами с использованием внешнего ключа, результат не тот, каким он должен быть.

Одна таблица называется Genotype_microsatellites, вторая таблица называется Records_morpho. Они связаны через внешний образец sample_id.

Если я только выбираю записи с определенными характеристиками из таблицы Genotype_microsatellites, используя следующую команду...

Gen_msat <- dbGetQuery(mydb, 'SELECT * 
                   FROM Genotype_microsatellites
                   WHERE CIDK113a >= 0')

... запрос возвращает 546 наблюдений для 52 переменных, что именно я ожидаю. Теперь я хочу сделать запрос, который добавляет немного больше информации к моим результатам, в частности, путем включения данных из таблицы Records_morpho. Поэтому я использую следующий код:

Gen_msat <- dbGetQuery(mydb, 'SELECT  Genotype_microsatellites.*,
                   Records_morpho.net_mass_g,
                   Records_morpho.svl_mm 
                   FROM Genotype_microsatellites
                   INNER JOIN Records_morpho ON Genotype_microsatellites.sample_id = Records_morpho.sample_id 
                   WHERE CIDK113a >= 0')

Проблема в том, что теперь на выходе имеется 890 наблюдений и 54 переменных! Некоторые значения sample_id (т.е. Строки или отдельные лица в кадре данных) отображаются несколько раз, что не должно быть. Я попытался исправить это, используя SLECT DISTINCT, но проблема не исчезнет.

Любая помощь приветствуется.

Теги:
inner-join

1 ответ

3
Лучший ответ

Похоже, что он работает так, как планировалось, вот как работают соединения. С A JOIN B ON Ax = By Вы получаете каждую строку из A, объединенную с каждой строкой из B, у которой y соответствует строке A x. Если в B есть 3 строки, которые соответствуют одной строке в A, вы получите три строки результатов для них. Данные строки будут повторяться для каждого соответствия строки В.

Чтобы пойти немного дальше, если x не является уникальным, а y не является уникальным. И у вас есть два x с одинаковым значением и три y с этим значением, они будут создавать шесть строк результатов.

Как вы сказали, DISTINCT не устраняет эту проблему, потому что DISTINCT работает через строку результатов. Он объединяет только строки результатов, если значения во всех выбранных полях одинаковы в этих строках результата. Аналогично, если у вас есть запрос на одну таблицу с повторяющимися строками, DISTINCT объединит эти строки, несмотря на то, что они являются отдельными строками, так как они не имеют разных наборов значений.

  • 0
    Полностью имеет смысл. Я думаю, мне нужно найти способ разобрать лишние записи из результатов. Спасибо.
  • 0
    Если у вас есть несколько записей для одного и того же образца, какие из них вы хотите получить в результатах? Если вам нужны все данные записи (B), вы обычно делаете объединение и просто игнорируете избыточные выборочные данные (A) при обработке результатов; но если данные A достаточно велики, чтобы их избыточность была проблематичной, может быть лучше запросить данные B отдельно и программно «соединиться» в клиенте.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню