Использование INNER JOIN умножает выбранные строки?

Есть много сообщений о внутренних соединениях, но я не уверен, что это полностью решает мою проблему?

У меня есть четыре таблицы, к которым я хочу присоединиться, в которых первые три кажутся правильными, когда я присоединяюсь к 4-й таблице, объединение умножает строки (таблица AB * таблица C).

В 4-й таблице всего 37 строк, однако каждая строка должна быть специально вставлена ​​несколько раз в соответствии с viewunitsonrun.strUnitCode, которые повторяются несколько раз в 1-й таблице (tblawardedlearers).

SELECT viewlearnersonrun.intRunID,
       intlearnerID,
       strFirstname, 
       strunitcode, 
       strGrade
  FROM tblawardedlearners
 INNER JOIN viewlearnersonrun
         ON viewlearnersonrun.intID = tblawardedlearners.intLearnerID
 INNER JOIN viewrun
         ON viewrun.intID = viewlearnersonrun.intRunID /*CORRECT TO THIS POINT */
 INNER JOIN viewunitsonrun
         ON viewunitsonrun.strUnitCode = tblawardedlearners.strUnitCode 
 WHERE viewlearnersonrun.intRunID = '200GE2'   /* display only one Course */

person starydynamo    schedule 30.11.2012    source источник
comment
Извините, но в вашем запросе объединены 4 таблицы.   -  person Hamlet Hakobyan    schedule 30.11.2012
comment
Ваш вопрос должен содержать все схемы таблиц, некоторые данные (могут быть поддельными) и желаемый результат, который вы хотите ВЫБРАТЬ. Так вы получите более адекватный ответ.   -  person Francis P    schedule 30.11.2012
comment
Не могу сказать ничего умного, не видя схемы и/или некоторых примеров данных!   -  person svidgen    schedule 30.11.2012
comment
@HamletHakobyan: 3 СОЕДИНЕНИЯ ‹-› 4 СТОЛА   -  person Francis P    schedule 30.11.2012
comment
@FrancisP У меня есть три стола, к которым я хочу присоединиться....   -  person Hamlet Hakobyan    schedule 30.11.2012
comment
Вы должны как минимум объяснить отношения между таблицами.   -  person Hamlet Hakobyan    schedule 30.11.2012
comment
Да, объединение таблиц может привести к тому, что результирующий набор записей будет умножаться, если в таблице есть несколько связанных записей. Здесь есть вопрос?   -  person UnhandledExcepSean    schedule 30.11.2012


Ответы (1)


Это приводит к декартовому произведению, потому что оба соединения возвращают кратные записи. Чтобы сохранить результаты после первого JOIN, вы должны убедиться, что остальные присоединяются по уникальным ключам. Если таблицы не имеют уникальных ключей для вашего выбора, вы можете сделать подзапрос (INLINE VIEW), используя DISTINCT или GROUP BY, чтобы он работал так, как вы хотите.

Образец:

SELECT viewlearnersonrun.intRunID,
       intlearnerID,
       strFirstname,
       strunitcode,
       strGrade
  FROM tblawardedlearners 
 INNER JOIN viewlearnersonrun
         ON viewlearnersonrun.intID = tblawardedlearners.intLearnerID
 INNER JOIN viewrun
         ON viewrun.intID = viewlearnersonrun.intRunID 
 INNER JOIN (SELECT DISTINCT strUnitCode --, others columns...
               FROM viewunitsonrun
            ) v
         ON  v.strUnitCode = tblawardedlearners.strUnitCode
 WHERE viewlearnersonrun.intRunID = '200GE2'
person Ftaveras    schedule 30.11.2012