Join 异常连接SQL

Join 异常连接SQL,join,sql-server-2012,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

我必须将以前的员工编写的代码转换为在新数据库中工作。在这样做的过程中,我遇到了一些我从未见过的连接,也不完全了解它们是如何工作的,或者是否需要以这种方式进行连接

连接如下所示:

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
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;
此代码的功能是否与以下内容不同:

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
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;
如果有差异,请解释第一套代码的用途


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

我看到了这种连接-它是处理多表连接的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

所以,是的,我相信你的假设是正确的,我可以创建一个临时表,然后加入其中。但是如果我可以在运行中使用cycles\RAM,为什么还要在额外的存储和索引上使用它呢

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

组成员表

  • 组名
  • 用户ID
  • 用户名
  • 帐户类型
  • 会计类型描述
SSRSOjbects\u权限表

  • 路径
  • 路径类型
  • 罗兰胺
  • 角色扮演者
  • 名称(广告组名称)
查询需要返回与每个报表关联的广告组中的每个人。基本上是用户到数据子集内报告的笛卡尔乘积。最简单的方法如下所示:

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
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;

您可以通过一个临时表和一些外部联接来实现这一点,但为什么要浪费系统资源呢?

这并不罕见。您正在子查询中创建一个子集数据,允许您对子集和整个集合执行操作,如分组,如示例2所示。我总是发现from子句中的括号非常混乱(除了描述派生表)。在我的有生之年,我从来没有使用括号编写过连接(我已经编写了数千个查询)。括号只起混淆作用。话虽如此,声明的结果是一样的。虽然它可能会强制连接顺序,但优化器无论如何都会按照它认为合适的方式执行。在具有左/右/全联接的语句中,需要进行一些调查。@SteveMangiameli我不确定我是否了解您仅对子集和整个集合进行分组。由于B中的同一字段等于C和A中的字段,因此对其中一个字段进行分组不会以相同的方式影响另一个字段。我唯一一次看到子集上的分组是在作为子查询执行完整的select语句时。虽然我对这一切还很陌生。另一方面,人们为什么要在连接中编写完整的Select语句,而不仅仅是创建临时表并连接到临时表中呢。在我看来,这样读起来容易多了。有几个原因,都与资源和性能有关。我将在回答中给出一个示例。“[…]完整的select语句作为子查询”>>,简称为派生表。因此,您的意思是,这可能是因为前员工具有MS Access背景。有道理,听起来很有可能。我的情况正好相反。我必须编写具有T-SQL背景的MS Access查询,我对这些嵌套联接感到非常惊讶:)是规则(在底部)Steve这太神奇了这真的帮助我理解了完整的select vs temp表的意义。但这里更重要的部分是,自从我开始使用SQL以来,我一直想知道交叉应用是否有用处。到目前为止,除了制作一个假数据库来摆弄之外,我从未见过一个这样的数据库。所以,感谢你在现实生活中使用了它,尽管你不知道我很好奇。:)