Sql server T-SQL左连接两次
下面的查询按计划工作,它精确地显示了我加入它的方式,这很好,但问题是,如果您有更多的用户“专门化”表,比如“邮件类型”或任何用户可以有多个数据的东西。。。您必须通过Sql server T-SQL左连接两次,sql-server,tsql,left-join,Sql Server,Tsql,Left Join,下面的查询按计划工作,它精确地显示了我加入它的方式,这很好,但问题是,如果您有更多的用户“专门化”表,比如“邮件类型”或任何用户可以有多个数据的东西。。。您必须通过ISNULL(在本例中)为每个和执行两个左连接并“赋予优先级” 我想知道,我如何避免使用两个联接,并在单个联接中“优先”使用typeid2而不是typeid1,这是可能的吗 if object_id('tempdb..#Tab1') is not null drop table #Tab1 create table #Tab1 (Us
ISNULL
(在本例中)为每个和执行两个左连接并“赋予优先级”
我想知道,我如何避免使用两个联接,并在单个联接中“优先”使用typeid2
而不是typeid1
,这是可能的吗
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个查询:
使用和:
使用和:
rextester演示用于以下两个方面: 两者都返回:
+--------+--------+-----------------+
| UserId | TypeId | TypeDescription |
+--------+--------+-----------------+
| 1 | 2 | Admin |
+--------+--------+-----------------+
事实上我认为你根本不需要加入。但是您必须在不考虑TypeDescription的情况下使用max TypeID,因为这些差异可能会击败一个组。因此,一种解决方法是在最初使用Max而不使用TypeDescription,然后子查询结果以获得TypeDescription
SELECT dT.*
,(SELECT TypeDescription FROM #Tab2 T2 WHERE T2.TypeId = dT.TypeId) [Role] --2. Subqueries TypeDescription using the Max TypeID
FROM (
select t1.UserId
,MAX(T1.TypeId) [TypeId]
--, T1.TypeDescription AS [Role] --1. differences will defeat group by. Subquery for value later in receiving query.
from #Tab1 t1
GROUP BY t1.UserId
) AS dT
产生输出:
UserId TypeId Role
1 2 Admin
我甚至不知道有带领带的上衣存在。。。谢谢你的帮助explanation@Veljko89很乐意帮忙!
SELECT dT.*
,(SELECT TypeDescription FROM #Tab2 T2 WHERE T2.TypeId = dT.TypeId) [Role] --2. Subqueries TypeDescription using the Max TypeID
FROM (
select t1.UserId
,MAX(T1.TypeId) [TypeId]
--, T1.TypeDescription AS [Role] --1. differences will defeat group by. Subquery for value later in receiving query.
from #Tab1 t1
GROUP BY t1.UserId
) AS dT
UserId TypeId Role
1 2 Admin