2013-11-11 7 views
0

Мне нужно обновить столбец таблицы до последней комбинации даты и времени из другой таблицы. Как я могу получить последнюю комбинацию даты и времени из одной таблицы, а затем обновить столбец с этой датой в другой таблице?Столбец UPDATE из одной таблицы в другую

Две таблицы, которые я использую, называются dbo.DD и dbo.PurchaseOrders. СОЕДИНЕНИЕ между двумя таблицами: dbo.DueDate.XDORD = dbo.PurchaseOrders.PBPO AND dbo.DueDate.XDLINE = dbo.PurchaseOrders.PBSEQ. Столбцы из dbo.DueDate, что мне нужна последняя дата/время от dbo.DueDate.XDCCTD and dbo.DueDate.XDCCTT.

Мне нужно установить dbo.PurchaseOrders.PBDUE = dbo.DueDate.XDCURDT. Я не могу использовать оператор ORDER BY в инструкции UPDATE, поэтому я не уверен, как это сделать. Я знаю, что row_number иногда работает в этих ситуациях, но я не уверен, как его реализовать.

+3

имена Кто ваши таблицы и столбцы? Тьфу. –

+0

LOL. Я знаю Аарона, извините, но у меня нет контроля над соглашениями об именах. Иногда они «имеют значение» для меня. – tsqln00b

+0

Как будто мой номерной знак имеет значение для меня иногда - но не для кого-либо еще, действительно, никогда. –

ответ

3

Общая картина:

;WITH s AS 
(
    SELECT 
    key, -- may be multiple columns 
    date_col, 
    rn = ROW_NUMBER() OVER 
    (
    PARTITION BY key -- again, may be multiple columns 
    ORDER BY date_col DESC 
    ) 
    FROM dbo.SourceTable 
) 
UPDATE d 
    SET d.date_col = s.date_col 
    FROM dbo.DestinationTable AS d 
    INNER JOIN s 
    ON d.key = s.key -- one more time, may need multiple columns here 
WHERE s.rn = 1; 

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

ли, кажется, однако, что OP получил этот конкретный код работы:

;WITH s AS 
    (
     SELECT 
     XDORD, XDLINE, 
     XDCURDT, 
     rn = ROW_NUMBER() OVER 
     (
     PARTITION BY XDORD, XDLINE 
     ORDER BY XDCCTD DESC, XDCCTT desc 
     ) 
     FROM dbo.DueDate 
    ) 
    UPDATE d 
     SET d.PBDUE = s.XDCURDT 
     FROM dbo.PurchaseOrders AS d 
     INNER JOIN s 
     ON d.PBPO = s.XDORD AND d.PBSEQ = s.XDLINE 
    WHERE s.rn = 1; 
Смежные вопросы