Скажем, у меня отношения один-ко-многим между клиентами и адресами.
Клиенты могут иметь несколько адресов с разными типами адресов (например, домашний, почтовый, рабочий, компания, будущее) и могут не иметь адреса или нескольких адресов одного и того же типа (в этом случае я с удовольствием возьму 1-й вхождение).
Мои данные состоят из клиентов, адресов и адресов. Предпочтительный порядок адресов addresstypeid составляет 2,3,4,1: поэтому, если у клиента есть addresstypeid 2, верните его, если не вернете запись с 3, если не 4, если не 1, и если не ноль.
Есть ли более элегантный способ сделать это, чем что-то подобное?
declare @addresses table
(
clientid int,
address varchar(10),
addresstypeid int
)
--2,3,4,1
insert into @addresses (clientid, address, addresstypeid)
select 1, '1a', 1 union all
select 1, '1b', 2 union all
select 1, '1c', 3 union all
select 1, '1d', 4 union all
select 2, '2a', 2 union all
select 2, '2b', 3 union all
select 2, '2c', 4 union all
select 2, '2a', 1 union all
select 3, '3a', 3 union all
select 3, '3b', 4 union all
select 3, '3c', 1 union all
select 4, '4a', 3 union all
select 4, '4b', 4 union all
select 5, '5a', 4 union all
select 6, '6a', 4 union all
select 6, '6b', 1 union all
select 7, '7a', 1 union all
select 7, '7b', 4
declare @ranktable table
(
addresstypeid int,
rank int
)
insert into @ranktable(addresstypeid, rank)
select 2, 1 union all
select 3, 2 union all
select 4, 3 union all
select 1, 4
select
e.address,
e.clientid,
e.addresstypeid
from
@addresses e
inner join @ranktable r on
e.addresstypeid = r.addresstypeid
inner join (select
em.clientid,
min(rank) minrank
from @addresses em
inner join @ranktable ranks on
em.addresstypeid = ranks.addresstypeid
group by
clientid) clientranks on
e.clientid = clientranks.clientid and
r.rank = clientranks.minrank