2010-10-16 85 views
0
UPDATE a 
SET CountOfAA=dt.CountOf, 
CountOfBB=dt.CountOf 
FROM @MediaResurce a 
INNER JOIN (SELECT 
       aa.Sku,ISNULL(COUNT(bb.sku),0) AS CountOf 
       FROM @MediaResurce      aa 
        LEFT OUTER JOIN @MediaResurce_Pics bb 
        ON aa.sku=bb.sku 
       WHERE somecol = 0 
       GROUP BY aa.Sku 
      ) dt ON a.sku=dt.sku 
INNER JOIN (SELECT 
       aa.Sku,ISNULL(COUNT(bb.sku),0) AS CountOf 
       FROM @MediaResurce      aa 
        LEFT OUTER JOIN @MediaResurce_Pics bb 
        ON aa.sku=bb.sku 
       WHERE somecol = 1 
       GROUP BY aa.Sku 
      ) dt2 ON a.sku=dt2.sku 
+2

没有任何上下文?如果你希望人们花时间回答你的问题,你应该投入一些时间来提问。您的问题很广泛,并且不会告诉我们您遇到的具体问题。 – 2010-10-16 00:12:46

+0

@Mitch小麦,这真的伤害了我的感情 – wil 2010-10-16 00:16:19

+0

这不是私人的(也不应该在SO上)。这是我的专家意见。你需要提供表格,包括定义的索引。告诉我们你目前有什么问题。 SO用户无法读取头脑... – 2010-10-16 00:18:18

回答

3

提供的内容有些抽象,很难提供反馈。

UPDATE a 
    SET CountOfAA = CASE WHEN b.somecol = 0 THEN b.CountOf END, 
     CountOfBB = CASE WHEN b.somecol = 1 THEN b.CountOf END 
    FROM @MediaResurce a 
    JOIN (SELECT aa.Sku, 
       somecol, 
       ISNULL(COUNT(bb.sku), 0) AS CountOf 
      FROM @MediaResurce aa 
    LEFT JOIN @MediaResurce_Pics bb ON aa.sku = bb.sku 
     WHERE somecol IN (0, 1) 
     GROUP BY aa.Sku, somecol) b ON b.sku = a.sku 
+0

这基本上查询一次,并根据“somecol”的值将结果放入2个存储桶中。我把这种方法全部加入,并且比使用连接进行两个子选择要快。 – Zachary 2010-10-16 02:46:00

0

刚开始从头开始编写,原来类似于OMG的回答是:

UPDATE a 
SET CountOfAA=dt.CountOfAA, 
    CountOfBB=dt.CountOfBB 
FROM @MediaResurce a 
INNER JOIN (
    SELECT 
     aa.sku, 
     SUM(CASE WHEN aa.somecol = 0 THEN 1 ELSE 0 END) AS CountOfAA, 
     SUM(CASE WHEN aa.somecol = 1 THEN 1 ELSE 0 END) AS CountOfBB 
    FROM @MediaResurce_Pics bb 
    INNER JOIN @MediaResurce aa ON aa.sku = bb.sku 
    GROUP BY aa.sku 
) dt ON dt.sku = a.sku 

点注意:

  • 我认为 'somecol' 是@MediaResurce。如果它存在于@MediaResurce_Pics中,我看不到第二个原因INNER JOIN
  • 对于更大的表,通过在源表上设置适当的索引(例如'sku'和' somecol”。但表变量不支持索引。你可以把它们改成临时表或固定表吗?这张桌子有多大?
相关问题