首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySQL: where子句如何对delete语句无效,但对select语句有效?

MySQL: where子句如何对delete语句无效,但对select语句有效?
EN

Stack Overflow用户
提问于 2018-08-20 08:48:42
回答 2查看 34关注 0票数 0

我正试图在mysql中运行一条delete语句--我得到一个错误。为了测试,我试着用"select *“而不是"delete”来运行它。没有其他的改变,它运行得很好。知道为什么吗?

下面是完整的delete语句

代码语言:javascript
复制
DELETE
from timeclock_raw tr
where tr.rectype = 'active'
      and tr.recdate > '2018-08-17'
      and tr.seconds < (select max(tr1.seconds) as secs
                        from timeclock_raw tr1
                        where tr1.env = tr.env and tr1.intid = tr.intid and tr1.studycode = tr.studycode and tr1.recdate = tr.recdate)
      and tr.seconds > (select min(tr2.seconds) as secs
                        from timeclock_raw tr2
                        where tr2.env = tr.env and tr2.intid = tr.intid and tr2.studycode = tr.studycode and tr2.recdate = tr.recdate);

我得到了这个错误

代码语言:javascript
复制
[2018-08-19 20:46:51] [42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'tr
[2018-08-19 20:46:51] where tr.rectype = 'active'
[2018-08-19 20:46:51] and tr.recdate > '2018-08-17'
[2018-08-19 20:46:51] and tr.' at line 2

但是这个运行的很好..。

代码语言:javascript
复制
select *
from timeclock_raw tr
where tr.rectype = 'active'
      and tr.recdate > '2018-08-17'
      and tr.seconds < (select max(tr1.seconds) as secs
                        from timeclock_raw tr1
                        where tr1.env = tr.env and tr1.intid = tr.intid and tr1.studycode = tr.studycode and tr1.recdate = tr.recdate)
      and tr.seconds > (select min(tr2.seconds) as secs
                        from timeclock_raw tr2
                        where tr2.env = tr.env and tr2.intid = tr.intid and tr2.studycode = tr.studycode and tr2.recdate = tr.recdate);

有什么想法吗?

编辑:基于第一个响应,我尝试了这个,但得到了另一个错误...有什么想法吗?

代码语言:javascript
复制
sql> delete tr
from timeclock_raw tr
where tr.rectype = 'active'
      and datediff(now(),tr.recdate) < 3
      and tr.seconds < (select max(tr1.seconds) as secs
                        from timeclock_raw tr1
                        where tr1.env = tr.env and tr1.intid = tr.intid and tr1.studycode = tr.studycode and tr1.recdate = tr.recdate)
      and tr.seconds > (select min(tr2.seconds) as secs
                        from timeclock_raw tr2
                        where tr2.env = tr.env and tr2.intid = tr.intid and tr2.studycode = tr.studycode and tr2.recdate = tr.recdate)
[2018-08-20 01:07:24] [HY000][1093] You can't specify target table 'tr' for update in FROM clause
[2018-08-20 01:07:24] [HY000][1093] You can't specify target table 'tr' for update in FROM clause
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-20 10:29:00

MySQL不允许您在查询的其余部分中使用正在删除(或更新)的表。正常的解决方案是使用joins:

代码语言:javascript
复制
delete tr
from timeclock_raw tr join
     (select tr1.env, tr1.intid, tr1.studycode, tr1.recdate, min(tr1.seconds) as minsecs, max(tr1.seconds) as maxsecs
      from timeclock_raw tr1
      group by tr1.env, tr1.intid, tr1.studycode, tr1.recdate
     ) x
     on tr1.env = tr.env and
        tr1.intid = tr.intid and
        tr1.studycode = tr.studycode and
        tr1.recdate = tr.recdate
where tr.rectype = 'active' and
      tr.recdate > '2018-08-17' and
      tr.seconds < x.maxsecs and
      tr.seconds > x.minsecs;
票数 1
EN

Stack Overflow用户

发布于 2018-08-20 09:07:20

错误不是在抱怨WHERE子句,而是在抱怨之前没有在FROM之前声明的表别名的使用。您需要将查询重写为

代码语言:javascript
复制
DELETE tr FROM timeclock_raw tr WHERE ...

查看manual页面的最末尾。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51922940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档