在SQL Server 2008中混合内部和外部联接

时间:2011-11-12 14:18:16

标签: sql-server-2008

我有一个包含3个表的数据库。这些表代表会员信息。我只想检索特定用户不属于的组的结果。我不知道该怎么做。目前,我正在考虑以下内容:

SELECT
  g.*,
  a.*
FROM    
  GroupInfo g 
    INNER JOIN [Address] a ON a.[ID]=g.[AddressID]
    OUTER JOIN [GroupMembership] m ON m.[GroupID]=g.[ID]
WHERE
  m.[MemberID]<>@memberID

我关注准确性和性能。我会走正确的路吗?

2 个答案:

答案 0 :(得分:0)

另一种方法是

 Select * From GroupInfo g Join Address a
     On a.Id = g.AddressId
 Where Not Exists
    (Select * From GroupMembership 
     Where GroupID = g.GroupID
        And MemberID = @memberID)

答案 1 :(得分:0)

我对这两种方法中的哪一种更快有疑问,所以我编写了一个测试。我创建了2个表,第一个表还包含第二个表的外键。然后我在表1中创建了一百万个条目,其中大约一半在表2中创建了一个链接条目。

然后我运行了连接版本和子查询版本。他们俩都提出了相同的价值观(好)。

有趣的是,它也完全相同:在我可怜的工作站上大约20秒。因此,如果您按照提议的方式或其他方式执行此操作似乎并不重要。如果连接表可能有多个值,我认为在子查询中添加前1会更快。

Select * From GroupInfo g Inner Join Address a
   On a.Id = g.AddressId
Where Not Exists
(Select Top 1 * From GroupMembership Where GroupID = g.GroupID
  And MemberID = @memberID)