更有效的SQL语句来消除我的n ^ 2算法?

时间:2015-05-11 23:33:14

标签: sql sql-server algorithm

让我们说以下是我的SQL表:

我的第一个表名为[Customer]

CustomerID    CustomerName    CustomerAddress
----------    ------------    ---------------
1             Name1           1 Infinity Loop
2             Name2           2 Infinity Loop
3             Name3           3 Infinity Loop

我的下一张表名为[Group]

GroupID       GroupName
-------       ---------
1             Group1
2             Group2
3             Group3

然后,要链接这两个,我有一个名为[GroupCustomer]的表。

GroupID    CustomerID
-------    ----------
1          2
1          3
2          1
3          1

所以在ASP.NET页面上,我有两个我想要显示的表。第一个表基本上是特定组中的所有客户。因此,在下拉列表中,如果我选择Group1,它将显示下表:

CustomerID    CustomerName    CustomerAddress
----------    ------------    ---------------
2             Name2           2 Infinity Loop
3             Name3           3 Infinity Loop

上表适用于"关联的所有客户"使用所选组(在本例中为Group1)。然后,在另一个表中,我希望它显示:

CustomerID    CustomerName    CustomerAddress
----------    ------------    ---------------
1             Name1           1 Infinity Loop

基本上,对于此表,我希望它显示不在所选组中的所有客户。

要为所选组中的所有客户生成表,我编写了以下SQL:

SELECT Customer.CustomerID, Customer.CustomerName, Customer.CustomerAddress   
FROM Customer
INNER JOIN GroupCustomer ON
    Customer.CustomerID = GroupCustomer.CustomerID
INNER JOIN [Group] ON
    GroupCustomer.GroupID = [Group].GroupID
WHERE [Group].GroupID = @selectedGroupParameter

所以当我提到我的n ^ 2算法时,我基本上使用了上面的SQL语句,并将它与我只是来自SELECT *表的Customer的SQL语句进行了比较。哪里有匹配,我只是简单地没有显示它。这非常低效,而且我并不为此感到骄傲。

这导致了我当前的问题,我能编写哪些最有效的SQL语句会消除我的n ^ 2?

2 个答案:

答案 0 :(得分:2)

您可以使用NOT EXISTSCustomer不在特定Group中:

SELECT *
FROM Customer c
WHERE
    NOT EXISTS(
        SELECT 1
        FROM GroupCustomer
        WHERE
            CustomerID = c.CustomerID
            AND GroupID = @selectedGroupParameter
    )

阅读Aaron Bertrand的article,了解解决此类问题及其性能比较的不同方法,NOT EXISTS根据他的测试速度最快。

SQL Fiddle

答案 1 :(得分:1)

Select * from Customer
where CustomerID not in
  (select CustomerID 
  from GroupCustomer 
  where GroupID = @selectedGroupParameter)

您可以使用not in进行此项检查。也就是说,你可能只是为了提高性能而摆脱了对Group表的连接,因为你似乎没有真正使用组名。