2012-02-28 6 views
2

У меня есть временная таблица с несколькими отдельными записями клиентов, и я хочу обновить один и тот же столбец во всех строках для одного и того же адреса электронной почты, если они имеют существующее значение:SQL Server - JOIN в инструкции 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 

в настоящее время у меня есть время цикла (цикл по строкам, которые еще должны быть обновлены), который содержит внутренний курсор цикл по столбцам, которые я хочу, чтобы обновить (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

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