更有效的方法来避免欺骗

时间:2013-11-26 21:53:19

标签: sql-server tsql

我正在做一个搜索引擎,它会收到供应商和品牌ID列表。它们以字符串形式出现,并转换为带有UDF的表。每个品牌都有供应商ID。

因此,为了限制用户选择的品牌和供应商的搜索,我需要用这些值填充临时表,然后将它们加入我的搜索结果中。现在,用户可以选择整个供应商进行搜索,然后选择其他不同供应商的品牌。这必须是订单方案,因此除了填写供应商ID以及供应商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 个答案:

答案 0 :(得分: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)

VS

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

结果:

-----------

(0 row(s) affected)


-----------
1

(1 row(s) affected)

2)出于表现原因。请阅读此article

注意:你应该进行一些测试,看看自己最适合自己的选择。