我不得不将前员工编写的代码转换为在新数据库中工作。在这样做的过程中,我遇到了一些我从未见过的联合,并且没有完全理解它们是如何工作的,或者是否需要以这种方式完成它们。
联接看起来像这样:
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中完成的。请提前感谢您提供的任何帮助。
答案 0 :(得分:2)
我可以创建临时表然后加入它。但是,如果我可以动态地执行它,为什么要在额外的存储和索引上使用cycle \ RAM?
我今天在SSRS中遇到了这个场景 - 用户希望通过AD组看到所有个人被授予访问权限。用户使用游标和一些临时表将用户从AD中取出,然后将用户加入到与AD组关联的每个SSRS对象(文件夹,报告,链接报告)。我使用Cross Apply和子查询简化了整个过程。
GroupMembers表
SSRSOjbects_Permissions表
查询需要返回与每个报告关联的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
所以,是的,我相信你的假设是正确的