SQL Server - ПРИСОЕДИНЯЙТЕСЬ к оператору UPDATE - PullRequest
2 голосов
/ 28 февраля 2012

У меня есть временная таблица с несколькими не различимыми записями клиентов, и я хочу обновить один и тот же столбец во всех строках для одного и того же адреса электронной почты, если они имеют существующее значение:

CustomerID | Email | Pref1 | Pref2 | Pref3
-----------------------------------------------------
1234    email1@domain.com    1    0    0
1235    email1@domain.com    1    1    0
1236    email1@domain.com    0    0    1
1237    email2@domain.com    0    0    0
1238    email2@domain.com    1    0    0

Должно стать:

CustomerID | Email | Pref1 | Pref2 | Pref3
-----------------------------------------------------
1234    email1@domain.com    1    1    1
1235    email1@domain.com    1    1    1
1236    email1@domain.com    1    1    1
1237    email2@domain.com    1    0    0
1238    email2@domain.com    1    0    0

В настоящее время у меня есть цикл while (цикл по строкам, которые еще не обновлены), который содержит внутренний курсор для циклического перемещения по столбцам, которые я хочу обновить (Pref1, Pref2, Pref3 и т. Д.). Это работает, но всегда требует большего набора записей.

Как я могу изменить ниже:

UPDATE #table
SET Pref1 = 
  (
  SELECT MAX(IsNull(Pref1,0)) 
  FROM #table 
  WHERE Email = 'email1@domain.com'
  ) 
WHERE Email = 'email1@domain.com'   

чтобы вместо каждого адреса электронной почты указывать адрес электронной почты обновляемой записи?

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

(Приведенный выше запрос не работает, он просто обновляет весь этот столбец для всех записей до 1, если он существует в этом столбце). Должен ли я использовать какое-то обновление соединения?

Ответы [ 4 ]

4 голосов
/ 28 февраля 2012

Если вы используете 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 голосов
/ 28 февраля 2012

Как насчет этого? Конечно, вам нужно будет адаптировать его к вашей среде, но он должен быть хорошим шаблоном для работы.

UPDATE 
#table1 

SET 
#table1.Pref1 = #table2.YourIsNullThingy

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

WHERE
#table2.Email IN (value1,value2,...) 
0 голосов
/ 28 февраля 2012

Попробуйте:

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
0 голосов
/ 28 февраля 2012

Вы можете сделать это с производной таблицей, чтобы найти максимальное значение каждого предпочтения для адреса электронной почты:

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
...