让我们说以下是我的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?
答案 0 :(得分:2)
您可以使用NOT EXISTS
让Customer
不在特定Group
中:
SELECT *
FROM Customer c
WHERE
NOT EXISTS(
SELECT 1
FROM GroupCustomer
WHERE
CustomerID = c.CustomerID
AND GroupID = @selectedGroupParameter
)
阅读Aaron Bertrand的article,了解解决此类问题及其性能比较的不同方法,NOT EXISTS
根据他的测试速度最快。
答案 1 :(得分:1)
Select * from Customer
where CustomerID not in
(select CustomerID
from GroupCustomer
where GroupID = @selectedGroupParameter)
您可以使用not in
进行此项检查。也就是说,你可能只是为了提高性能而摆脱了对Group表的连接,因为你似乎没有真正使用组名。