2009-06-11 2 views
1

Я пытаюсь обновить таблицу 1 в DB1 данными из таблицы 2 в DB2. Я могу подключать и получать данные из таблицы DB2 Table2 в таблицу DB1 Table1, но проблема, с которой я сталкиваюсь, - получение данных MOST RECENT из таблицы DB2 Table2.Как обновить другую таблицу с самыми последними данными в SQL?

Я ищу 3 поля в DB2: f1, f2, & f3. f1 содержит дубликаты (и там, где я сопоставляюсь с таблицей 1 DB1), а 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

ответ

1

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

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 который ставит последнюю версию во временную таблицу, когда она обновляется.

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

+0

Вы сравниваете f1 с f3, поэтому я уверен, что это не сработает правильно. –

+0

@samjudson Мне удалось получить код, работающий с помощью вашего метода, но для его обновления требуется некоторое время. Я думал о настройке триггера для обновления таблицы 1 сразу после того, как Table2 был обновлен или вставлен таким образом, что информация будет обновляться в режиме реального времени, а не в ночное время. Считаете ли вы, что инициированное обновление будет быстрее (после того, как я впервые обновляюсь в первый раз)? – JFV

+0

Да, гораздо быстрее. Кроме того, я замечаю, что вы конвертируете дату с даты в строку. Если возможно иметь оба поля в качестве дат, это ускорит процесс, поскольку преобразование не должно происходить. – samjudson

0
and (b.f3 > c.f3 OR b.f3 is null) 

В вашем где п, конечно.

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

+0

Я не думаю, что это ответ. b.f3 имеет значение NULL для каждой строки. Он хочет схватить ряд с MAX (c.f3) –

+0

Хороший момент, я виню утра. Добавлено условие OR, чтобы обработать это ... снова, если я правильно читаю, b.f3 не всегда будет нулевым, поскольку он будет обновляться один раз, а в следующий раз, когда он запустит это, ему все равно придется работать. – CodeRedick

1
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 

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

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

@Tom H. Я попробовал просмотр, но он все еще встречается с повторяющимися данными, и я не уверен, почему ... btw, поле даты идет в nvarchar (10) в другой БД, поэтому я переформатировал Это. – JFV

+0

Если есть несколько строк с одинаковой точной датой для того же ID, вы получите дубликаты. Вам нужно будет дополнительно определить, что составляет «последнюю» строку в этом случае. Что касается даты nvarchar (10), я предположил, что вы ее конвертировали, потому что это то, что находится в целевой БД. Я хотел сказать, что это не должно быть в пункте назначения. –

Смежные вопросы