Вопрос

В SQL-сервере 2008:

Предположим, у меня есть две таблицы.

Таблица1 имеет 3 поля:Имя, Дата1 и Дата2.В настоящее время все записи Date2 имеют значение NULL.(Имя, Дата1) образуют уникальный ключ.

Таблица2 имеет 2 поля:Имя и Дата2.(Имя, Дата2) образуют уникальный ключ.

Каждому «Имени» в Таблице 1 соответствует хотя бы одна соответствующая запись в Таблице 2.

Теперь я хочу обновить все записи Date2 в Таблице 1 (помните, что сейчас все они имеют значение NULL) до записи Date2 в Таблице 2, которая является ближайший до даты1 в Таблице1.Т.е.дата, которая даст результат:

 min(datediff(dd,Table1.Date1,Table2.Date2))

Итак, чтобы внести ясность, если у меня есть следующие записи:

Таблица 1:

[Имя]:Карл, [Дата1]:01.01.2009, [Дата2]:НУЛЕВОЙ

Таблица 2:

[Имя]:Карл, [Дата2]:01.01.2000

[Имя]:Карл, [Дата2]:07.01.2009

[Имя]:Карл, [Дата2]:01.01.2010

Затем я хочу обновить Table1.Date2 до «07.01.2009», поскольку это ближайшая дата к «01.01.2009».

Большое спасибо

Карл

Это было полезно?

Решение

WITH abcd AS
 (
 SELECT t1.Name,t1.Date1, t2.Date2
  ,RANK() OVER (ORDER BY ABS(DATEDIFF(dd, t1.Date1, t2.Date2)) ASC) AS rnk
 FROM 
  Table1 AS t1 
  JOIN Table2 AS t2 ON t1.Name = t2.Name
 )
UPDATE Table1 SET
    [Date2] = (SELECT TOP(1) [Date2] FROM abcd WHERE rnk = 1)

Другие советы

UPDATE  Table1
SET     Date2 = t2.Date2
FROM    Table1 t1
JOIN    Table2 t2
    ON  t1.Name = t2.Name
    AND ABS(DATEDIFF(d, t1.Date1, t2.Date2)) = (SELECT  MIN(ABS(DATEDIFF(d, t1.Date1, t2.Date2)))
                                                FROM    Table1 t1
                                                JOIN    Table2 t2
                                                    ON  t1.Name = t2.Name
                                                )

Проверьте, нужно ли вам ABS - Думаю, да.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top