Объединение нескольких таблиц

У меня есть сценарий, в котором у меня есть 3 таблицы (Table1, Table2, Table3)

Table1 содержит данные, благодаря которым каждый MEMBNO уникален

Я хотел бы от JOIN до Table2 и Table3 отображать результаты, но иметь только одну строку для каждого результата

Я старался

SELECT A.MEMBNO,A.FIELD1,B.FIELD1,B.FIELD2,C.FIELD1
FROM Table1 A
INNER join Table2 B ON A.MEMBNO = B.MEMBNO
INNER join Table3 C ON A.MEMBNO = C.MEMBNO

но я получаю несколько результатов. Если MEMBNO находится в таблице 2 дважды и в таблице 3 четыре раза, я получаю 8 строк.

Является ли мое JOIN правильным или это единственный способ контролировать это с помощью оператора WHERE после JOIN для управления тем, что возвращается из таблицы 2 и таблицы 3 (т.е. SQL «тупой» объединяет все данные и ожидает, что оператор WHERE будет файлером? )

Большое спасибо


person Mike    schedule 12.01.2015    source источник
comment
Укажите вариант использования. Вопрос сейчас слишком общий.   -  person PM 77-1    schedule 12.01.2015
comment
потому что ваши отношения таблицы 1 с таблицей 2 и таблицей 3 являются одним-многими, поэтому вы получаете каждую запись для каждой записи в другой таблице.   -  person HaveNoDisplayName    schedule 12.01.2015
comment
@PareshJ, используя LEFT JOIN, у вас все равно будет несколько записей.   -  person dario    schedule 12.01.2015
comment
В зависимости от вашей бизнес-логики используйте GROUP BY или DISTINCT поверх вашего JOIN.   -  person PM 77-1    schedule 12.01.2015
comment
Какую совпадающую строку из двух других таблиц должен выбрать SQL? SQL возвращает все совпадающие строки, если не указано иное.   -  person Gordon Linoff    schedule 12.01.2015
comment
вы также можете добавить дополнительные условия присоединения в предложение ON (а не только в WHERE).   -  person lp_    schedule 12.01.2015


Ответы (3)


То, с чем вы боретесь, - это разные отношения между данными. Table1 — это таблица первичного ключа, в которой есть одна строка для каждого MEMBNO. Таблица2\3 содержит более одной строки для каждого MEMBNO. Поэтому вам нужно подумать о том, какие данные вы действительно хотите видеть, прежде чем пытаться присоединиться. Разница в количестве элементов вызывает дублирование строк при объединении. Если вы хотите, чтобы данные в таблице 2\3 были объединены в одну строку, подумайте, как это может выглядеть. то есть вы хотите суммировать числа из разных строк в общую сумму? вы хотите взять максимальную дату? так далее

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

person sarin    schedule 12.01.2015

Поскольку я беспокоюсь только о MEMBNO. Что, если я использую отдельный MEMBNO из обеих таблиц Table2 и Table3.

Проверьте приведенный ниже пример:

create table #t1
(
F1 int,
F2 int
)

Insert into #t1 values(1, 111)

Create table #t2
(
F1 int,
F2 int
)

Insert into #t2 values(1, 111)
Insert into #t2 values(1, 222)

Create table #t3
(
F1 int,
F2 int
)

Insert into #t3 values(1, 333)
Insert into #t3 values(1, 444)


SELECT a.*
FroM #t1 a left join  (Select distinct f1 from #t2) b on a.F1 = b.f1
left join  (Select distinct f1 from #t3) c on a.F1 = c.f1

Где #t1, #t2, #t3 — таблица1, таблица2, таблица3 соответственно, И F1 — ваш MEMBNO во всех таблицах.

person Paresh J    schedule 12.01.2015
comment
Зачем вам объединяться с двумя таблицами только со столбцом, который является первичным ключом первой? Я имею в виду, вы выбираете данные только из первой таблицы. Это равно SELECT * FROM #t1. - person dario; 12.01.2015

Вы получаете несколько результатов из-за использования внутреннего соединения. Вы должны использовать левое или правое соединение.

person erakm    schedule 12.01.2015
comment
должен быть комментарий, а не ответ? - person HaveNoDisplayName; 12.01.2015
comment
При соединении LEFT или RIGHT вы все равно получите несколько строк. - person dario; 12.01.2015
comment
неправильный ответ. Причина - кардинальность\отношения. - person sarin; 12.01.2015