Выбор SQL с несколькими ссылками на одну таблицу - PullRequest
13 голосов
/ 10 августа 2010

У меня есть база данных SQL, которая содержит несколько реляционных таблиц.В основной таблице есть несколько полей, которые ссылаются на другую таблицу несколько раз.Например, скажем, у меня есть база данных продавцов, которые отвечают за продажи в нескольких штатах.В моей базе данных есть поля для State1, State2 и State3, все из которых соответствуют таблице состояний.Я не могу понять, как написать запрос для возврата записи со всеми перечисленными состояниями.Если бы мне было нужно только одно поле «Состояние», я бы знал:

SELECT Master.Name, State.Enumeration AS 'State'
FROM MasterTable Master, StateTable State
WHERE Master.State1 = State.ID;

Как я могу расширить это для всех полей моего состояния?

Спасибо.

Ответы [ 2 ]

11 голосов
/ 10 августа 2010

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

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
6 голосов
/ 10 августа 2010

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

   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

ВНУТРЕННЕЕ СОЕДИНЕНИЕ требует наличия данных - если нет, вся запись исключается. СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ безопаснее, например, если state1 / 2/3 / etc допускает NULL ...

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