2009-03-02 5 views
2

Ich habe die folgende Abfrage:Wie trete ich Tabellen an einem Update

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

die für Datensätze mit Status 5 in einer bestimmten Stadt sucht, die älter als 6 Monate (das Datum, für das in LA gespeichert). Dies ergibt ungefähr 4k Ergebnisse. Ich möchte den Wert des Status 1 auf jedem dieser Datensätze aktualisieren, und so mein Update wie folgt aussieht:

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

aber es Stände und sperrt den db. Ich vermute, es ist ein Problem, weil es keine beitreten, aber ich versuche, so etwas wie:

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

und es wird offensichtlich nicht funktionieren, da es keine ‚von‘ in einem Update.

bearbeiten> Ich verwende MySQL

+0

Welche DB verwenden Sie? – geofftnz

Antwort

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

Danke, das hat perfekt funktioniert. –

1

Ich würde dies tun:

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) 

Siehe auch:

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

+0

Das funktioniert bei MySQL nicht. – Quassnoi

+0

beantwortet, bevor er redigierte, um MySQL zu sagen - ich hätte es wahrscheinlich erraten werden sollen – MikeW

1

In SQL Server 2005 dies funktionieren wird:

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

Ich benutze diesen Stil sogar für eine einzige Tabelle - so dass alle UPDATE-Anweisungen konsistent sind, und eine JOINed-Tabelle kann später einfach hinzugefügt werden. Normalerweise verwende "U" für den Alias ​​für die zu aktualisierende Tabelle: UPDATE U SET Col1 = 1 VON MyTable1 AS U JOIN MyTable2 ON T2_ID = U.ID – Kristen

+0

Das ist das Format, das ich auch für alle meine SQL verwende - aber ich benutze Aliase, die Abkürzungen für den Tabellennamen sind, wie "i" für Item, "p" für Preis, weil ich faul bin und es leichter ist, sich daran zu erinnern. :-) –

3

Für MySQL, können Sie alte Join-Syntax verwenden:

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

Dies sollte für jedes standardkonforme DBMS funktionieren, einschließlich SQL Server –

+0

Dies funktioniert bei Oracle nicht. Sie müssten die Inline-Ansicht aktualisieren: UPDATE (SELECT * FROM L, LA WHERE ...) SET L.status = 1, und selbst in diesem Fall konnte L nicht aktualisiert werden, da es in dieser Abfrage nicht der Schlüssel ist (diese Ansicht) kann ein L.ROWID mehrmals zurückgeben). – Quassnoi

Verwandte Themen