gpt4 book ai didi

sql-server - T-SQL 左连接两次

转载 作者:行者123 更新时间:2023-12-02 12:32:49 24 4
gpt4 key购买 nike

下面的查询按计划工作,它准确地显示了我加入它的方式,这很好,但问题是,如果您有更多的用户“特化”表,例如“邮件类型”或任何其他内容,用户可以拥有多个数据...您必须为每个数据进行两个左连接,并通过ISNULL(在本例中)“给予优先级”(在本例中)

我想知道,如何避免使用两个连接并在单个连接中“给予”TypeId 2 优先于 TypeId 1 的优先级,这可能吗?

if object_id('tempdb..#Tab1') is not null drop table #Tab1
create table #Tab1 (UserId int, TypeId int)
if object_id('tempdb..#Tab2') is not null drop table #Tab2
create table #Tab2 (TypeId int, TypeDescription nvarchar(50))

insert into #Tab1 (UserId, TypeId)
values
(1, 1),
(1, 2)
insert into #Tab2 (TypeId, TypeDescription)
values
(1, 'User'),
(2, 'Admin')

select *, ISNULL(t2.TypeDescription, t3.TypeDescription) [Role]
from #Tab1 t1
LEFT JOIN #Tab2 t2 on t1.TypeId = t2.TypeId and
t2.TypeId = 2
LEFT JOIN #Tab2 t3 on t1.TypeId = t3.TypeId and
t3.TypeId = 1

最佳答案

第一个问题是确定优先级。在这种情况下,您可以使用最大的 TypeId,但这似乎不是一个好主意。您可以添加另一列作为优先级序数。

从这里开始,它是每组查询的前 1 个:

使用 top with tiesrow_number() :

select top 1 with ties
t1.UserId, t1.TypeId, t2.TypeDescription
from #Tab1 t1
left join #Tab2 t2
on t1.TypeId = t2.TypeId
order by row_number() over (
partition by t1.UserId
order by t2.Ordinal
--order by t1.TypeId desc
)

使用 common table expressionrow_number() :

;with cte as (
select t1.UserId, t1.TypeId, t2.TypeDescription
, rn = row_number() over (
partition by t1.UserId
order by t2.Ordinal
--order by t1.TypeId desc
)
from #Tab1 t1
left join #Tab2 t2
on t1.TypeId = t2.TypeId
)
select UserId, TypeId, TypeDescription
from cte
where rn = 1
<小时/>

rextester 演示:http://rextester.com/KQAV36173

两者都返回:

+--------+--------+-----------------+
| UserId | TypeId | TypeDescription |
+--------+--------+-----------------+
| 1 | 2 | Admin |
+--------+--------+-----------------+

关于sql-server - T-SQL 左连接两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47181295/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com