Выбор SQL с помощью нескольких ссылок на единственную таблицу

У меня есть 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?

Спасибо.

13
задан lumberjack4 10 August 2010 в 18:24
поделиться

2 ответа

Возвращаем столбец из каждого уникального джоина к государствам:

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
11
ответ дан 1 December 2019 в 23:46
поделиться

Вам необходимо использовать псевдонимы таблиц, чтобы объединить несколько копий одной и той же таблицы:

   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 ...

6
ответ дан 1 December 2019 в 23:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: