2013-11-26 15 views
1

我这样做,接收供应商和品牌标识的列表的搜索引擎。它们以字符串形式出现,并被转换为UDF表格。每个品牌都有一个供应商ID。更有效的方式,以避免受骗者

所以为了限制由由我需要填写这些值的临时表,然后他们在一起,我的搜索结果的用户选择的品牌和供应商我的搜索。现在用户可以选择整个供应商进行搜索,但之后选择另一个不同供应商的品牌。这必须是一个订单的情况,所以除了填充供应商列表iwth供应商ID的传入的参数,我还必须抓住从他们在传递品牌供应商的ID并加载它们也。

有一堆的授权码也,我已经剥离出来,但是这基本上是我在做什么。

INSERT INTO #TempBrandList (Brand_ID, Brand_Owner) 
SELECT gID, brands.brandowner FROM dbo.f_ConvertGuidList_to_Table(@brandList) JOIN brands ON TempBrandList.Brand_ID=brands.brandid 

INSERT INTO #TempSupplierList (Supplier_ID) 
SELECT gID FROM dbo.f_ConvertGuidList_to_Table(@supplierList) 

INSERT INTO #TempSupplierList (Supplier_ID) 
SELECT DISTINCT Brand_Owner FROM #TempBrandList WHERE Brand_OWNER NOT IN (SELECT Supplier_ID FROM #TempSupplierList) 

我很担心NOT IN会导致问题,效率不高。是否最好有2个#temp表,只需要直接插入,然后再插入另一个DISTINCT插入第二个,将第二个插入我的主搜索代码以限制结果?

+1

我不会担心性能问题,直到你确实有一个。不在IN是非常有效的。 – Paparazzi

回答

3

在过去的发言中,我会用NOT EXISTS代替NOT IN这样的:

INSERT INTO #TempSupplierList (Supplier_ID) 
SELECT DISTINCT x.Brand_Owner 
FROM #TempBrandList x 
WHERE NOT EXISTS 
(
    SELECT * FROM #TempSupplierList y 
    WHERE x.Brand_OWNER = y.Supplier_ID 
) 

为什么?

1)NOT IN可以给你带来意想不到的结果:

SELECT 1 WHERE 2 NOT IN(SELECT 3 UNION ALL SELECT NULL)

SELECT 1 WHERE NOT EXISTS(SELECT * FROM (SELECT 3 UNION ALL SELECT NULL) x(y) WHERE x.y = 2)

结果:

2)由于性能原因。请阅读article

注意:您要运行一些测试,看看自己什么是你最好的选择。

相关问题