Внутренняя проблема объединения для обновления в SQL Server 2008

sql sql-server-2008

57 просмотра

2 ответа

У меня есть две таблицы, и я пытаюсь обновить время с помощью delta в таблице 1 с помощью внутреннего соединения, но у меня возникла проблема с моим запросом ниже.

UPDATE Table-1
SET Table-1.Time = DATEADD(minutes,,table-2.delta,table-1.time)
FROM Table-1
INNER JOIN Table-2 ON Table-1.TynameName = Table-2.Typename 
                   AND Table1.Ordersequence >= table-2.ordersequence;

Время обновляется только для номера заказа> 4 (10 минут) для заказа 9, а затем дельта-обновления для заказа 9 и выше для (5 минут).

Мой результат должен состоять в том, что номер заказа больше 4 должен быть обновлен (10 минут) до 12 (последовательность заказов), а номер больше 9 должен быть обновлен (5 минут) до 12 (последовательность заказов)

Прямо сейчас я использую цикл while, чтобы разрешить его, выбрав каждую строку таблицы-2 и обновив время таблицы-1.

Можно ли добиться этого с помощью объединений?

введите описание изображения здесь

Автор: D Jaison Источник Размещён: 08.11.2019 11:27

Ответы (2)


0 плюса

Решение

Используйте cross apply:

Update Table-1
    set .Time= DATEADD(minutes, t2.delta, t1.time)
from [Table-1] t1 cross apply
      (select top 1 t2.*
       from [Table-2] t2
       where t1.Typename = t2.Typename and
             t1.Ordersequence >= t2.ordersequence
       order by t2.ordersequence desc
      ) t2;

Проблема, с которой вы столкнулись, состоит в том, что несколько строк совпадают Table-2. В этом случае одна из строк выбирается произвольно для обновления. В cross applyисправляет эту проблему, выбирая первую строку , которая соответствует.

Автор: Gordon Linoff Размещён: 20.08.2016 03:03

0 плюса

кажется, у вас неправильный синтаксис (в обновлении нет предложения from, а таблица / объединение должна быть указана перед установкой)

Update Table-1
 inner Join Table-2 on Table-1.TynameName=Table-2.Typename 
        and Table1.Ordersequence>=table-2.ordersequence
SET Table-1.Time= DATEADD(minutes,,table-2.delta,table-1.time)
where table-2.ordersequence != 9
;
Автор: scaisEdge Размещён: 20.08.2016 02:48
Вопросы из категории :
32x32