INNER JOIN в MySQL возвращает несколько записей в одной строке - PullRequest
0 голосов
/ 08 июня 2018

Я использую 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, но проблема не исчезла.

Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 08 июня 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...