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

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

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

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

Спасибо.

Ответы

Ответ 1

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

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

Ответ 2

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

   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

INNER JOIN требует наличия данных - если нет, вся запись исключается. LEFT JOIN более безопасен, например, если state1/2/3/etc разрешает NULL...

Ответ 3

select tbl_book_con1.city,con1,tbl_book_destination.city,destination,labar_char,tbl_book_c_from.city,c_from,tbl_book_c_to.city,c_to,tbl_book_payment.city,paymentid from tbl_booking tbb_bookinner join tbl_master tbl_book_con1 on tbl_book_con1.id = tbb_book.con1
inner join tbl_master tbl_book_destination on tbl_book_destination.id = tbb_book.con1
inner join tbl_master tbl_book_c_from on tbl_book_c_from.id = tbb_book.con1
inner join tbl_master tbl_book_c_to on tbl_book_c_to.id = tbb_book.con1
inner join tbl_master tbl_book_payment on tbl_book_payment.id = tbb_book.con1