2009-03-02 12 views
2

J'ai la requête suivante:Comment puis-je joindre des tables sur une mise à jour

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 cherche des documents ayant un statut 5 dans une ville qui sont plus de 6 mois (la date à laquelle est stockée dans LA). Cela renvoie environ 4k résultats. Je voudrais mettre à jour la valeur de l'état à 1 sur chacun de ces dossiers, et donc ma mise à jour ressemble à:

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 les stalles et des serrures db. Je pense qu'il ya un problème parce qu'il n'y a pas de rejoindre, mais je tente 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 évidemment ne fonctionnera pas parce qu'il n'y a pas « de » dans une mise à jour.

modifier> J'utilise MySQL

+0

Qu'est-ce que DB utilisez-vous? – geofftnz

Répondre

7
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 
) 
+0

Merci, cela a fonctionné parfaitement. –

1

je ferais 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:

SQL update from one Table to another based on a ID match

+0

Cela ne marchera pas sur MySQL. – Quassnoi

+0

répondu avant de modifier pour dire MySQL - je devrais probablement deviné – MikeW

1

Dans SQL Server 2005 ceci fonctionne:

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); 
+0

J'utilise ce style même pour une seule table - de sorte que toutes les instructions UPDATE sont cohérentes, et une table JOINed peut facilement être ajoutée plus tard. Normalement, utilisez "U" pour l'alias pour la table en cours de mise à jour: MISE À JOUR U SET Col1 = 1 FROM MyTable1 AS U JOIN MyTable2 ON T2_ID = U.ID – Kristen

+0

C'est le format que j'utilise aussi pour tout mon SQL - mais j'utilise alias qui sont des abréviations pour le nom de la table, comme "i" pour Item, "p" pour le prix parce que je suis paresseux et c'est plus facile à retenir. :-) –

3

Pour MySQL, vous pouvez utiliser 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) 
+0

Cela devrait fonctionner pour tout SGBD conforme aux normes, y compris SQL Server –

+0

Cela ne fonctionnera pas sur Oracle. Vous devez mettre à jour la vue en ligne: UPDATE (SELECT * FROM L, LA WHERE ...) SET L.status = 1, et même dans ce cas L ne peut pas être mis à jour, car il n'est pas conservé dans cette requête (cette vue peut renvoyer un L.ROWID plusieurs fois). – Quassnoi