У меня есть DB SQL, который содержит несколько реляционных таблиц. Существуют некоторые поля в основной таблице что ссылка другая таблица многократно. Например, скажите, что у меня есть база данных продавцов, которые ответственны за продажи для нескольких состояний. Моя база данных имеет поля для State1, State2 и State3, все из которых отображаются назад на таблицу States. Я не могу выяснить ни за что в жизни, как записать запрос для возврата записи со всеми перечислимыми состояниями. Если бы мне только было нужно одно поле State, я знаю, что сделал бы:
SELECT Master.Name, State.Enumeration AS 'State'
FROM MasterTable Master, StateTable State
WHERE Master.State1 = State.ID;
Как я могу развернуть это для всех своих полей State?
Спасибо.
Возвращаем столбец из каждого уникального джоина к государствам:
select m.Name, s1.Enumeration as State1, s2.Enumeration as State2, s3.Enumeration as State3
from MasterTable m
left join StateTable s1 on m.State1 = s1.ID
left join StateTable s2 on m.State2 = s2.ID
left join StateTable s3 on m.State3 = s3.ID
Возврат 1 столбца всех штатов из 3 джойнов:
select m.Name, ISNULL(s1.Enumeration + ',','')
+ ISNULL(s2.Enumeration + ',','')
+ ISNULL(s3.Enumeration,'') as Enumeration
from MasterTable m
left join StateTable s1 on m.State1 = s1.ID
left join StateTable s2 on m.State2 = s2.ID
left join StateTable s3 on m.State3 = s3.ID
Есть еще столбцы-запросы...
select m.Name,
ISNULL((select Enumeration from StateTable where ID = m.State1),'') as State1,
ISNULL((select Enumeration from StateTable where ID = m.State2),'') as State2,
ISNULL((select Enumeration from StateTable where ID = m.State3),'') as State3
from MasterTable m
Вам необходимо использовать псевдонимы таблиц, чтобы объединить несколько копий одной и той же таблицы:
SELECT m.Name,
s1.Enumeration AS 'State1',
s2.Enumeration AS 'State2'
FROM MasterTable m
LEFT JOIN StateTable s1 = s1.id = m.state1
LEFT JOIN StateTable s2 = s1.id = m.state2
ВНУТРЕННЕЕ СОЕДИНЕНИЕ требует наличия данных - в противном случае исключается вся запись. LEFT JOIN более безопасен, например, если state1 / 2/3 / etc допускает NULL ...