Comment puis-je joindre des tables sur une mise à jour
-
03-07-2019 - |
Question
J'ai la requête suivante:
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);
qui recherche les enregistrements de statut 5 dans une ville particulière âgés de plus de 6 mois (dont la date est stockée dans LA). Cela renvoie environ 4k résultats. Je souhaite mettre à jour la valeur du statut sur 1 pour chacun de ces enregistrements. Ma mise à jour ressemble à ceci:
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);
mais il se bloque et verrouille la base de données. Je soupçonne qu'il y a un problème car il n'y a pas de jointure, mais j'essaie quelque chose comme:
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);
et cela ne fonctionnera évidemment pas car il n'y a pas de "de" dans une mise à jour.
modifier > J'utilise MySQL
La solution
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
)
Autres conseils
Pour MySQL
, vous pouvez utiliser l'ancienne syntaxe de jointure:
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)
Je voudrais faire ceci:
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)
Voir aussi:
à un autre en fonction d'un identifiant correspondant
Dans SQL Server 2005, cela fonctionnera:
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);