Sql server T-SQL中的“IN”语句是否有其他选择?

Sql server T-SQL中的“IN”语句是否有其他选择?,sql-server,database,tsql,Sql Server,Database,Tsql,考虑以下代码片段: SELECT vbs.SKUID, SKUName, SUM(vbs.Quantity) AS Qty FROM BatchStocks AS vbs WHERE vbs.SKUID IN (Here i have almost 12000 SKU) AND vbs.StoreID IN (%q) AND vbs.StockType = %n GROUP BY vbs.SKUID, vbs.SKUName 在whe

考虑以下代码片段:

SELECT 
    vbs.SKUID, SKUName, SUM(vbs.Quantity) AS Qty
FROM   
    BatchStocks AS vbs
WHERE  
    vbs.SKUID IN (Here i have almost 12000 SKU)
    AND vbs.StoreID IN (%q)
    AND vbs.StockType = %n
GROUP BY
    vbs.SKUID, vbs.SKUName
在where条件下,我有将近12000个SKUID,执行语句需要很多时间。您能建议我如何改进此查询吗?

您可以使用EXISTS

将SKU放入临时表中

改为

WHERE  EXISTS
       (
           SELECT *
           FROM   #TEMP x
           WHERE  x.SKUID  = vbs.SKUID 
       )
您可以使用EXISTS

将SKU放入临时表中

改为

WHERE  EXISTS
       (
           SELECT *
           FROM   #TEMP x
           WHERE  x.SKUID  = vbs.SKUID 
       )
您还可以使用内部联接EXISTS而不是IN。 请参阅以下查询:

SELECT 
    vbs.SKUID, SKUName, SUM(vbs.Quantity) AS Qty
FROM   
    BatchStocks AS vbs
WHERE  
    EXISTS ( select 1 from #TEMPTABLE t on t.SKUID = vbs.SKUID)
    AND vbs.StoreID IN (%q)
    AND vbs.StockType = %n
GROUP BY
    vbs.SKUID, vbs.SKUName
有关内部联接,请参阅以下查询:

SELECT 
    vbs.SKUID, SKUName, SUM(vbs.Quantity) AS Qty
FROM   
    BatchStocks AS vbs
    INNER JOIN #TEMPTABLE t on t.SKUID = vbs.SKUID
WHERE  vbs.StoreID IN (%q)
    AND vbs.StockType = %n
GROUP BY
    vbs.SKUID, vbs.SKUName
您还可以使用内部联接EXISTS而不是IN。 请参阅以下查询:

SELECT 
    vbs.SKUID, SKUName, SUM(vbs.Quantity) AS Qty
FROM   
    BatchStocks AS vbs
WHERE  
    EXISTS ( select 1 from #TEMPTABLE t on t.SKUID = vbs.SKUID)
    AND vbs.StoreID IN (%q)
    AND vbs.StockType = %n
GROUP BY
    vbs.SKUID, vbs.SKUName
有关内部联接,请参阅以下查询:

SELECT 
    vbs.SKUID, SKUName, SUM(vbs.Quantity) AS Qty
FROM   
    BatchStocks AS vbs
    INNER JOIN #TEMPTABLE t on t.SKUID = vbs.SKUID
WHERE  vbs.StoreID IN (%q)
    AND vbs.StockType = %n
GROUP BY
    vbs.SKUID, vbs.SKUName

将这12000个SKUID放入他们自己的表中,然后只做一个内部联接…将这12000个SKUID放入他们自己的表中,然后只做一个内部联接…小心联接,如果有任何重复,则会返回两行或更多行,而本应是一行。小心联接,如果存在任何重复项,则将为本应为单个的行返回2行或更多行。