2012-02-28 73 views
2

我有一个临时表,其中包含多个不同的客户记录,如果它们具有相同的电子邮件地址,我想要更新同一列中的所有行:SQL Server - 在UPDATE语句中加入

CustomerID | Email | Pref1 | Pref2 | Pref3 
----------------------------------------------------- 
1234 [email protected] 1 0 0 
1235 [email protected] 1 1 0 
1236 [email protected] 0 0 1 
1237 [email protected] 0 0 0 
1238 [email protected] 1 0 0 

应该改为:

CustomerID | Email | Pref1 | Pref2 | Pref3 
----------------------------------------------------- 
1234 [email protected] 1 1 1 
1235 [email protected] 1 1 1 
1236 [email protected] 1 1 1 
1237 [email protected] 1 0 0 
1238 [email protected] 1 0 0 

目前,我有一个while循环(循环比那些尚未更新的行),包含一个内部光标遍历我想更新的列(PREF1 ,Pref2,Pref3等)。这是有效的,但是会在更大的记录集上永久存在。

我如何修改如下:

UPDATE #table 
SET Pref1 = 
    (
    SELECT MAX(IsNull(Pref1,0)) 
    FROM #table 
    WHERE Email = '[email protected]' 
) 
WHERE Email = '[email protected]' 

,这样,而不是传递每一个电子邮件地址,在某种程度上是指它的更新记录的电子邮件地址?

UPDATE #table 
SET Pref1 = 
    (
    SELECT MAX(IsNull(Pref1,0)) 
    FROM #table 
    WHERE Email = #table.email 
) 

(上面的查询不起作用,它只是更新了所有记录的是整列1,如果该列存在)。我应该使用某种更新连接吗?

回答

4

如果您使用的是SQL Server 2005或更高版本:

WITH maxvalues AS (
    SELECT 
    *, 
    MaxPref1 = MAX(Pref1) OVER (PARTITION BY Email), 
    MaxPref2 = MAX(Pref2) OVER (PARTITION BY Email), 
    MaxPref3 = MAX(Pref3) OVER (PARTITION BY Email) 
    FROM #table 
) 
UPDATE maxvalues 
SET 
    Pref1 = ISNULL(MaxPref1, 0), 
    Pref2 = ISNULL(MaxPref2, 0), 
    Pref3 = ISNULL(MaxPref3, 0) 
+0

完美,正是我一直在寻找。谢谢! – TheTor 2012-02-29 10:42:22

0

你可以做到这一点与派生表,得出每个电子邮件地址各人喜好的最大值:

update #table 
set Pref1 = mPref1, 
    Pref2 = mPref2, 
    Pref3 = mPref3 
from #table t 
    inner join (select Email, max(Pref1) mPref1, max(Pref2) mPref2, max(Pref3) mPref3 
       from #table 
       group by Email) m on m.Email = t.Email 
0

怎么这样呢?当然,你需要适应你的环境,但应该是一个很好的工作模板。

UPDATE 
#table1 

SET 
#table1.Pref1 = #table2.YourIsNullThingy 

FROM 
#table1 INNER JOIN #table2 
    ON #table1.Email= #table2.Email 

WHERE 
#table2.Email IN (value1,value2,...) 
0

试试这个:

UPDATE t1 
SET t1.Pref1 = ot2.newPref1 
, t1.Pref2 = ot2.newPref2 
, t1.Pref3 = ot2.newPref3 
FROM testTable AS t1 
OUTER APPLY 
(SELECT MAX(IsNull(t2.Pref1, 0)) AS newPref1 
, MAX(IsNull(t2.Pref2, 0)) AS newPref2 
, MAX(IsNull(t2.Pref3, 0)) AS newPref3 
FROM testTable t2 
where t2.e = t1.e) 
ot2