Как мне объединить таблицы при обновлении - PullRequest
2 голосов
/ 03 марта 2009

У меня следующий запрос:

select      count(L.ID)
from        LA inner join L on (LA.leadid = L.ID)
where       L.status = 5
and         L.city = "cityname"
and         Date(LA.Datetime) < Date_Sub(Now(), INTERVAL 6 MONTH);

, который ищет записи со статусом 5 в определенном городе старше 6 месяцев (дата, для которой хранится в Лос-Анджелесе). Это возвращает около 4k результатов. Я хотел бы обновить значение статуса до 1 для каждой из этих записей, поэтому мое обновление выглядит следующим образом:

update      L, LA
set         L.status = 1
where       L.status = 5 
and         L.city = "cityname" 
and         Date(LA.SomeDatetime) < Date_Sub(Now(), INTERVAL 6 MONTH);

но он останавливается и блокирует БД. Я подозреваю, что есть проблема, потому что нет соединения, но я пытаюсь что-то вроде:

update      L, LA
from        L inner join LA on (L.OID = LA.leadid)
set         L.status = 1
where       L.status = 5 
and         L.syscity = "cityname" 
and         Date(LA.SomeDatetime) < Date_Sub(Now(), INTERVAL 6 MONTH);

и он, очевидно, не будет работать, потому что в обновлении нет 'from'.

edit> Я использую MySQL

Ответы [ 4 ]

7 голосов
/ 03 марта 2009
update      L
set         L.status = 1
where       L.status = 5 
and         L.city = "cityname" 
and         EXISTS (
  select * from LA 
  where Date(LA.SomeDatetime) < Date_Sub(Now(), INTERVAL 6 MONTH)
  and LA.leadid = L.ID
)
3 голосов
/ 03 марта 2009

Для MySQL вы можете использовать старый синтаксис объединения:

UPDATE  l, la
SET     l.status = 1
WHERE   l.status = 5
  AND   l.city = "cityname"
  AND   la.leadid = l.id
  AND   DATE(la.datetime) < DATE_SUB(NOW(), INTERVAL 6 MONTH)
1 голос
/ 03 марта 2009

В SQL Server 2005 это будет работать:

Update L
   set L.status = 1
from
   L
   --
   JOIN LA
      on (LA.leadid = L.id)
where
   L.status = 5
   and L.city = "cityname"
   and Date(LA.Datetime) < Date_Sub(Now(), INTERVAL 6 MONTH);
1 голос
/ 03 марта 2009

Я бы сделал это:

update L
set status = 1
from LA
where L.OID = LA.leadid
and L.status = 5
and L.syscity = "cityname"
and Date(LA.SomeDatetime) < Date_Sub(Now(), INTERVAL 6 MONTH)

Смотри также:

Обновление SQL из одной таблицы в другую на основе совпадения идентификатора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...