2010-10-16 43 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」。但表變量不支持索引。你可以把它們改成臨時表或固定表嗎?這張桌子有多大?