[英]SQL preferred one-to-many relationship
假設我在客戶端和地址之間有一對多的關系。
客戶端可以有多個具有不同地址類型的地址(例如,家庭,郵政,工作,公司,未來),並且可能沒有相同類型的地址或多個地址(在這種情況下,我很樂意第一次出現)。
我的數據包括clientid,address和addresstypeid。 addresstypeid的首選順序是2,3,4,1:所以如果客戶端的addresstypeid為2,則返回該值,如果不返回3,如果不是4,則返回,如果不是1,則返回null。
有沒有更優雅的方式來做這個比這樣的事情?
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
這兩個表很好,但是當你把它們永久化時你應該考慮索引:)
就你的最終查詢而言,我會稍微改變一下......
WITH
sorted_data
AS
(
SELECT
[a].*,
ROW_NUMBER() OVER (PARTITION BY [a].clientid ORDER BY [r].rank) AS sequence_id
FROM
@addresses AS [a]
INNER JOIN
@ranktable AS [r]
ON a.addresstypeid = r.addresstypeid
)
SELECT
*
FROM
sorted_data
WHERE
sequence_id = 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.