Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T-SQL左连接两次_Sql Server_Tsql_Left Join - Fatal编程技术网

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