Pergunta

servidor No SQL 2008:

Suponha que eu tenho duas tabelas.

Tabela 1 tem 3 campos: Nome, data1 e data2. Atualmente, todas as entradas date2 são NULL. (Nome, Date1) formam uma chave única.

Tabela2 tem 2 campos: Nome e data2. (Nome, data2) formam uma chave única.

Cada "Nome" na Tabela 1 tem pelo menos uma entrada correspondente na Table2.

Agora, eu quero atualizar todas as entradas date2 na Tabela 1 (lembre-se que eles são todos NULL agora) para a entrada Date2 em Table2 que é o mais próximo para Date1 na Tabela 1. Ou seja, a data em que lhe daria o resultado de:

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

Assim, para ser claro, se eu tiver as seguintes entradas:

Tabela 1:

[Nome]: Karl, [Date1]: 1/1/2009, [data2]: NULL

Table2:

[Nome]: Karl, [data2]: 1/1/2000

[Nome]: Karl, [data2]: 1/7/2009

[Nome]: Karl, [data2]: 1/1/2010

Então eu quero atualizar Table1.Date2 para '1/7/2009' uma vez que é a data mais próxima '1/1/2009'.

Muito obrigado

Karl

Foi útil?

Solução

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)

Outras dicas

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
                                                )

verificar se você precisa ABS -. Eu acho que você faça

Além disso, a consulta não lidar com o caso onde há 2 datas em Table2 com a mesma distância para o Date1, mas a partir de lados diferentes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top