Как обновить другую таблицу с самыми последними данными в SQL? - PullRequest
1 голос
/ 11 июня 2009

Я пытаюсь обновить Table1 в DB1 данными из Table2 в DB2. Я могу подключиться и получить данные из DB2 Table2 в DB1 Table1, но у меня возникла проблема с получением НАИБОЛЕЕ СОВРЕМЕННЫХ данных из DB2 Table2.

Я смотрю на 3 поля в DB2: f1, f2 и f3. f1 содержит дубликаты (и там, где я сопоставляюсь с DB1 Table1), а f3 - поле даты, и я хочу получить самую последнюю дату для обновления DB1 Table1. Ниже приведен код, который я использовал:

Update Table1
Set f2 = c.f2, 
    f3 = convert(varchar, c.f3, 101) 
From Table1 b 
    inner join Server.DB.dbo.Table2 c on b.f1 = c.f1
Where b.f1 = c.f1 

Пример данных:

c.f1    c.f2         c.f3
8456    RS47354      06/30/2009
8456    M101021      10/31/2009 (want this one)
7840    5574         NULL
7840    RH013057     06/30/2010 (want this one)
7650    RS48100      06/30/2007
7650    RS49010      06/30/2009 (want this one)

b.f1        b.f2         b.f3
8456        Null         Null
7840        Null         Null
7650        Null         Null

В конечном итоге это будет установлено в пакете служб SSIS.

Любая помощь приветствуется!

-JFV

Ответы [ 3 ]

1 голос
/ 11 июня 2009

Я не уверен, является ли это ускоренным кодом в мире, это, очевидно, зависит от того, насколько близки два сервера и сколько у вас данных в каждой таблице.

UPDATE Table1
SET 
    f2 = T2.f2, 
    f3 = convert(varchar, T2.f3, 101) 
FROM 
    Table1 T1
INNER JOIN 
    Server.DB.dbo.Table2 T2
ON 
    T1.f1 = T2.f1
WHERE 
    T2.f3 = (SELECT MAX(f3) FROM Server.DB.dbo.Table2 WHERE f1 = T1.f1)

Альтернативой (если у вас есть такой большой контроль) является создание триггера для Table2, который помещает последнюю версию во временную таблицу при каждом ее обновлении.

Обновление: исправлен код.

1 голос
/ 11 июня 2009
UPDATE
     T1
SET
     f2 = T2.f2,
     f3 = T2.f3  -- If it's a date, save it as a date, not a VARCHAR
FROM
     dbo.Table1 T1
INNER JOIN Server.db.dbo.Table2 T2 ON
     T2.f1 = T1.f1
LEFT OUTER JOIN Server.db.dbo.Table2 T2_later ON
     T2_later.f1 = T2.f1 AND
     T2_later.f3 > T2.f3
WHERE
     T2_later.f1 IS NULL

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

CREATE VIEW dbo.T2_Latest
AS
     SELECT
          T2.f1,
          T2.f2,
          T2.f3
     FROM
          dbo.Table2 T2
     LEFT OUTER JOIN dbo.Table2 T2_later ON
          T2_later.f1 = T2.f1 AND
          T2_later.f3 > T2.f3
     WHERE
          T2_later.f1 IS NULL

Тогда вам просто нужно присоединиться к f1 (кстати, вам не нужны эти критерии и в INNER JOIN, и в предложении WHERE). Представление отфильтрует более ранние строки ДО того, как ему нужно будет сравнить их по серверам.

В службах SSIS есть другие решения, использующие компонент Merge, Lookup, или Join, который, вероятно, будет работать лучше.

0 голосов
/ 11 июня 2009
and (b.f3 > c.f3 OR b.f3 is null)

В вашем предложении where, конечно.

Если я правильно читаю ваш вопрос ...

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