Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在更新时联接表_Mysql_Sql_Join_Sql Update - Fatal编程技术网

Mysql 如何在更新时联接表

Mysql 如何在更新时联接表,mysql,sql,join,sql-update,Mysql,Sql,Join,Sql 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); 它在特定城市中查找状态为5的记录,这些记录的日期超过6个月,并且存储在LA中。这

我有以下疑问:

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个月,并且存储在LA中。这将返回大约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”

编辑>我正在使用MySQL

我会这样做:

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

我甚至对单个表也使用这种样式,这样所有的UPDATE语句都是一致的,并且以后可以很容易地添加联接表。通常使用U作为被更新表的别名:在T2_ID=U.ID上加入MyTable2时从MyTable1更新U SET Col1=1这是我所有SQL使用的格式,但我使用的别名是表名的缩写,比如I表示Item,p表示price,因为我很懒,而且更容易记住-这应该适用于任何符合标准的DBMS,包括SQL Server。这在Oracle上不起作用。您需要更新内联视图:更新选择*从L,LA,其中。。。设置L.status=1,即使在这种情况下,L也无法更新,因为它不是此查询中保留的密钥。此视图可以多次返回一个L.ROWID
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)