Выбрать и обновить;SQL Server - PullRequest
2 голосов
/ 20 марта 2012

Мне нужно зациклить таблицу tab_A запись по записи и обновить таблицу tab_B в соответствии с содержимым каждой возвращаемой записи:

SELECT item, regBy, MAX(regTime) AS latestUpdateTime
FROM tab_A
GROUP BY item, regBy;

Результат должен быть циклично введен по записи, и для каждой записи должно быть выполнено следующее ОБНОВЛЕНИЕ:

UPDATE tab_B
SET lastUpdated = "data from latestUpdateTime in SQL above"
lastUpdBy = "data from regBy in SQL above"
WHERE item = "data from item in SQL above"

Я не знаком с Transact SQL, поэтому любая помощь будет признательна.

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

Вы можете легко превратить обычный оператор выбора в оператор обновления, заменив SELECT * на UPDATE table...

Это позволяет вам сначала проверить, что будет обновляться, прежде чем фактически применить обновление.

Выберите выписку

SELECT *
FROM   tab_B b
       INNER JOIN (
          SELECT  item
                  , regBy
                  , MAX(regTime) AS latestUpdateTime
         FROM     tab_A
         GROUP BY 
                  item
                  , regBy
       ) a ON a.item = b.item

Оператор обновления

UPDATE tab_B
SET    lastUpdated = a.latestUpdateTime
       , lastUpdBy = a.regBy
FROM   tab_B b
       INNER JOIN (
          SELECT  item
                  , regBy
                  , MAX(regTime) AS latestUpdateTime
         FROM     tab_A
         GROUP BY 
                  item
                  , regBy
       ) a ON a.item = b.item

Другой способ проверить обновление и, в зависимости от вашей версии, - начать транзакцию и использовать предложение OUTPUT.

BEGIN TRAN

UPDATE tab_B
SET    lastUpdated = a.latestUpdateTime
       , lastUpdBy = a.regBy
OUTPUT INSERTED.*
FROM   tab_B b
       INNER JOIN (
          SELECT  item
                  , regBy
                  , MAX(regTime) AS latestUpdateTime
         FROM     tab_A
         GROUP BY 
                  item
                  , regBy
       ) a ON a.item = b.item

ROLLBACK TRAN           
2 голосов
/ 20 марта 2012

Если вы используете SQL Server 2005 или новее , вы можете сделать что-то вроде этого:

;WITH TableAData AS
(
   SELECT 
       item, regBy, regTime,
       RowNum = ROW_NUMBER() OVER(PARTITION BY item ORDER BY regTime DESC)
   FROM dbo.tab_A
)
UPDATE dbo.tab_B
SET 
    lastUpdated = a.regTime,
    lastUpdBy = a.regby
FROM TableAData a    
WHERE
    tab_B.item = a.item 
    AND a.RowNum = 1

По сути, это CTE (Common Table Expression) упорядочивает ваши данные таким образомтаким образом, что для каждого item вычисляется RowNum (с самым последним значением RowNum = 1).

С этим вы можете легко обновить tab_B в одном выражении - нетСтрока за агонизирующей строкой необходима!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...