Объединить запрос со сглаженным результатом - PullRequest
2 голосов
/ 15 ноября 2010

У меня есть следующие объекты:

alt text

AddressType - это просто поле enum, которое определяет, является ли электронная почта личной / рабочей / другой.

Возможно ли этосделать запрос, который возвращает плоский результат, подобный приведенному в следующем примере?

CustomerID    Full Name       Personal Email         Work Email
-----------   --------------  -----------------      -----------------------
1             John Doe        johndoe@hotmail.com    john.doe@company.com

Ответы [ 2 ]

2 голосов
/ 15 ноября 2010
select c.CustomerID, 
    c.FullName as [Full Name], 
    epersonal.AddressText as [Personal Email], 
    ework.AddressText as [Work Email]
from Customer c
left outer join Email epersonal on c.CustomerID = epersonal.CustomerID 
    and epersonal.AddressType = 'personal'
left outer join Email ework on c.CustomerID = ework.CustomerID 
    and epersonal.AddressType = 'work'
1 голос
/ 15 ноября 2010

Два основных варианта:

1) Выберите его как обычно (с двумя строками, по одной для каждого письма), затем используйте оператор pivot для выравнивания.

Пример pivot (я называю это примером, как я написал его в блокноте. Это может быть немного неправильно, но это должно указать вам правильный путь):

select
  CustomerID,
  FullName
  [1] as WorkEmail,
  [2] as HomeEmail
from
  (select 
    c.CustomerID, c.FullName, e.AddressText, e.AddressType
   from 
     Customer c
     join emails e on e.CustomerID = c.CustomerID) as Source
pivot (
  AddressText
  FOR AddressType in ([1], [2])
)

2) Присоединяйтесь к таблице электронной почты дважды, по одному разу для каждого типа адреса. Предложите внешние соединения, чтобы, если одно отсутствует, вы все равно получили другое.

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