2011-03-10 59 views
0

我需要使用Inner Join连接5个表。SQL Server INNER JOIN会产生问题吗?

这是一个很好的做法还是会做在以后的几年任何不一致?

随便看看

SELECT Distinct(email) 
FROM AP_GROUPS_INTO_ORGANIZATION M 
INNER JOIN GROUPSDB G on G.ID = M.GROUPID 
INNER JOIN aspnet_Roles r ON R.RoleName = G.GROUPNAME 
INNER JOIN aspnet_UsersInRoles U ON U.RoleId = R.RoleId 
INNER JOIN aspnet_membership a on a.UserId = U.UserId 
WHERE G.GROUPNAME = 'GROUP001' 
+6

5'JOIN's是确定的,如果这就是你所需要的语义。我可能会更改为'WHERE EXISTS'而不是'JOIN',然后使用'DISTINCT'摆脱重复。确保您查看查询计划并在FK列上添加任何必需的索引。 – 2011-03-10 11:34:04

+1

@Martin我会非常小心的推荐DISTINCT的使用如此自由。我已经看到了开发人员编写查询的情况,查看了一堆重复内容,只需粘在DISTINCT中即可摆脱它们而不理解正在发生的事情。我不是在这里说这种情况,但它不是我鼓励人们在没有考虑的情况下使用的。 – SecretDeveloper 2011-03-10 11:58:50

+1

@Kaius - 我绝对不建议'DISTINCT'我说的相反,事实上,他们应该使用'WHERE EXISTS' ** **代替(尽管可能不足够强烈) – 2011-03-10 12:00:24

回答

1

这应该是罚款。我发现你在查询中使用了aspnet表格,我建议不要先进行一些测试来改变它们的结构或索引,以确保你不会创建新问题。

它很常见的有这个号码,如果你的数据是高度标准化的连接。

0

我会改变的唯一的事,它从把表基础的标准限制了前面,而不是较低的连接表中的将移动你的组台前面一样......此外,压痕的基础有助于清楚地显示表格之间的关系。

SELECT 
     Distinct(email) 
    FROM 
     GROUPSDB G 
     INNER JOIN AP_GROUPS_INTO_ORGANIZATION M 
      ON G.ID = M.GROUPID 
     INNER JOIN aspnet_Roles r 
      ON G.GROUPNAME = R.RoleName 
      INNER JOIN aspnet_UsersInRoles U 
       ON R.RoleId = U.RoleId 
       INNER JOIN aspnet_membership a 
        on U.UserId = a.UserId 
    WHERE 
     G.GROUPNAME = 'GROUP001' 
-1

虽然是绝对没有错:

SELECT Distinct(email) 
FROM 
    AP_GROUPS_INTO_ORGANIZATION M 
     INNER JOIN 
    GROUPSDB G 
     ON G.ID = M.GROUPID 
     INNER JOIN 
    aspnet_Roles r 
     ON R.RoleName = G.GROUPNAME 
     INNER JOIN 
    aspnet_UsersInRoles U 
     ON U.RoleId = R.RoleId 
     INNER JOIN aspnet_membership a 
     ON a.UserId = U.UserId 
WHERE 
    G.GROUPNAME = 'GROUP001' 

fomatted因为我更喜欢亲自现在格式化已经进入了画面, 如果您的服务器配置为区分大小写(双关语意)比较可能要更改:
ON R.RoleName = G.GROUPNAMEON LOWER(R.RoleName) = LOWER(G.GROUPNAME)
G.GROUPNAME = 'GROUP001'LOWER(G.GROUPNAME) = LOWER('GROUP001')

这将防止未来的错误希望。

+0

-1结束语所有列使用以'在使JOIN谓词完全不可变的函数中加入JOIN是一个糟糕的主意。 – 2011-03-10 16:43:59

+0

@Martin我不明白你的意思?什么是'unsargable'。也是你投票,因为格式偏好这是真正的个人喜好?答案是提出一个更重要的观点,你有没有读过它? – mohsensajjadi 2011-03-10 17:51:02

+0

与个人格式设置无关! 'unsargable'意味着一个索引不能用于连接。 – 2011-03-10 23:49:00