Обновить столбец из столбца другой таблицы на основе соответствующих столбцов - PullRequest
3 голосов
/ 07 октября 2011

Следующий запрос обновляет все записи (80 КБ) вместо совпадающих (5 КБ).Что с ним не так и как его можно исправить?

update ALAM set ALAM.CDate = (select IDCP.CDate from IDCP 
                              where ALAM.ASID = IDCP.ASID and ALAM.AID = IDCP.AID 
                                    and ALAM.MCode = '10001')

Количество записей в таблице ALAM = 80 000 записей приблизительно Количество записей в таблице IDCP = 5000 записей приблизительно

В качестве дополнительной информации:

select ALAM.ASID, ALAM.AID, ALAM.CDate 
from ALAM, IDCP 
where ALAM.ASID = IDCP.ASID and ALAM.AID = IDCP.AID and ALAM.MCode = '10001' 

результат 5000 записей приблизительно

Ответы [ 4 ]

6 голосов
/ 07 октября 2011
MERGE INTO ALAM
   USING IDCP 
      ON ALAM.ASID = IDCP.ASID 
         AND ALAM.AID = IDCP.AID 
         AND ALAM.MCode = '10001'
WHEN MATCHED THEN
   UPDATE 
      SET CDate = IDCP.CDate;
2 голосов
/ 07 октября 2011

Вы не указываете версию SQL Server. Вы можете использовать собственный синтаксис UPDATE...FROM во всех версиях.

UPDATE ALAM
SET ALAM.CDate = IDCP.CDate
FROM ALAM
JOIN IDCP ON  ALAM.ASID = IDCP.ASID and ALAM.AID = IDCP.AID 
WHERE ALAM.MCode = '10001'

Или более стандартный оператор MERGE в SQL Server 2008.

1 голос
/ 07 октября 2011

В первом утверждении вы не указали условие WHERE в основном запросе. Таким образом, он выполняется для всех записей в ALAM (я предполагаю, что это 80 КБ).

Во втором запросе вы объединяете две таблицы, поэтому вы берете только те из ALAM, которые соответствуют тем, которые есть в IDCP. Вот что пошло не так.

UPDATE ALAM
SET a.CDate = i.CDate
FROM ALAM a INNER JOIN IDCP i ON a.ASID = i.ASID and a.AID = i.AID 
WHERE a.MCode = '10001'
0 голосов
/ 07 октября 2011

Как сказал tjekkles, вы не включили предложение WHERE в обновление, которое вы можете извлечь из внутреннего выбора:

update ALAM set ALAM.CDate = (select IDCP.CDate
                                from IDCP 
                               where ALAM.ASID = IDCP.ASID
                                 and ALAM.AID  = IDCP.AID ) 
 where ALAM.MCode = '10001'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...