我刚刚在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'
但是这个查询似乎不起作用,现在有人可以告诉我当我有多个表要搜索时如何删除或更新记录。任何帮助是极大的赞赏。
答案 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'