使用派生表删除,更新?

时间:2014-05-15 14:31:07

标签: mysql sql

我刚刚在mysql中研究了FROM子句和derived tables,大多数网站都使用SELECT命令提供了示例

示例SELECT * FROM (SELECT * FROM usrs) as u WHERE u.name = 'john'

但是当我尝试使用删除或更新命令时,它似乎不起作用。

示例DELETE FROM (SELECT * FROM usrs) as u WHERE u.name = 'john'

1064 - 您的SQL语法出错;查看与您的MySQL服务器版本相对应的手册,以便在附近使用正确的语法(SELECT * FROM usrs)作为u WHERE.name ='john'在行

UPDATE (SELECT * FROM usrs) as u SET u.lname ='smith' WHERE u.name = 'john'

1288 UPDATE的目标表e不可更新

因此派生表不适用于删除或更新命令?或者有办法让它发挥作用。

我想写一个获取记录并对该记录执行删除操作的子查询,而不是为更新和删除写表名?这可能在mysql中吗?

更新我必须删除一条记录并且我有三张表,该记录可能存在于任何一个表中

我的方法delete from first table rows effected? quit: else check second table rows effected? quit : else check third table

但如果我使用 UNION ALL 我可以这样做

Delete from (select * from tb1 union all select * from tb2 union all select * from tb3) e as e.uname = 'john'

但是这个查询似乎不起作用,现在有人可以告诉我当我有多个表要搜索时如何删除或更新记录。任何帮助是极大的赞赏。

2 个答案:

答案 0 :(得分:2)

您无法直接从子查询中删除,但如果您愿意,仍然可以使用它,您只需要在JOIN中使用它:

DELETE usrs
FROM usrs
    INNER JOIN (
        SELECT * FROM usrs WHERE name = 'john'
    ) t ON usrs.Id = t.Id

或者您可以使用IN

DELETE usrs
WHERE ID IN (
   SELECT ID
   FROM usrs
   WHERE name = 'John'
)

有了这个说法,对于这个例子,我不知道为什么你想要一个子查询:

DELETE usrs WHERE name = 'John'

根据评论进行编辑。要同时从多个表中删除,您可以使用多个DELETE语句,也可以使用以下内容:

delete t1, t2, t3
from (select 'john' as usr) t
  left join t1 on t.usr=t1.usr
  left join t2 on t.usr=t2.usr
  left join t3 on t.usr=t3.usr

答案 1 :(得分:1)

派生表仅存在于他们所属的父查询的持续时间内。假设MySQL允许这种语法和操作,请考虑会发生什么:

a)您的主查询开始执行
b)子查询执行并将其结果作为临时表返回 c)父更新改变了临时表
d)父查询完成
e)清理和删除临时表

基本上你除了浪费一堆cpu周期和磁盘带宽之外什么也没做。

UPDATE查询允许您加入其他表以在WHERE子句中使用,例如..

UPDATE maintable
LEFT JOIN othertable ON maintable.pk = othertable.fk
SET maintable.somefield='foo'
WHERE othertable.otherfield = 'bar'