我正在做一个搜索引擎,它会收到供应商和品牌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插入到第二个,将第二个插入到我的主搜索代码中以限制结果?
答案 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。
注意:你应该进行一些测试,看看自己最适合自己的选择。