不寻常加入SQL

时间:2016-03-08 20:48:10

标签: join sql-server-2012

我不得不将前员工编写的代码转换为在新数据库中工作。在这样做的过程中,我遇到了一些我从未见过的联合,并且没有完全理解它们是如何工作的,或者是否需要以这种方式完成它们。

联接看起来像这样:

From Table A
     Join(Table B
          Join Table C
               on B.Field1 = C.Field1)
          On A.Field1 = B.Field1

此代码的功能是否与以下内容不同:

From Table A
     Join Table B
          On A.Field1 = B.Field1
     Join Table C
          On B.Field1 = C.Field1

如果存在差异,请说明第一组代码的用途。

所有这些都是在SQL Server 2012中完成的。请提前感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:2)

我可以创建临时表然后加入它。但是,如果我可以动态地执行它,为什么要在额外的存储和索引上使用cycle \ RAM?

我今天在SSRS中遇到了这个场景 - 用户希望通过AD组看到所有个人被授予访问权限。用户使用游标和一些临时表将用户从AD中取出,然后将用户加入到与AD组关联的每个SSRS对象(文件夹,报告,链接报告)。我使用Cross Apply和子查询简化了整个过程。

GroupMembers表

  • 组名
  • 用户ID
  • 用户名
  • ACCOUNTTYPE
  • AccountTypeDesc

SSRSOjbects_Permissions表

  • 路径
  • PathType
  • ROLENAME
  • RoleDesc
  • 名称(广告组名称)

查询需要返回与每个报告关联的AD组中的每个人。基本上是用户的笛卡尔积,用于在数据子集内进行报告。最简单的方法是这样的:

select 
    G.GroupName, G.UserID, G.Name, G.AccountType, G.AccountTypeDesc,
    [Path], PathType, RoleName, RoleDesc
from 
    GroupMembers G
cross apply 
    (select 
         [Path], PathType, RoleName, RoleDesc 
     from 
         SSRSOjbects_Permissions  
     where 
         Name = G.GroupName) S;

您可以使用临时表和一些外连接实现此目的,但为什么要浪费系统资源?

答案 1 :(得分:1)

我看到了这种连接 - 它是处理多表连接的MS Access风格。在MS Access中,您需要将每个后续join语句嵌套到其级别括号中。所以,例如这个T-SQL连接:

SELECT a.columna, b.columnb, c.columnc
FROM tablea AS a 
LEFT JOIN tableb AS b ON a.id = b.id 
LEFT JOIN tablec AS c ON a.id = c.id

你应该转换成这个:

SELECT a.columna, b.columnb, c.columnc
FROM ((tablea AS a) LEFT JOIN tableb AS b ON a.id = b.id) LEFT JOIN tablec AS c ON a.id = c.id

所以,是的,我相信你的假设是正确的