2 nullyb nullyb 于 2017.09.19 00:41 提问

新手简单SQL语句编写。
sql

用户表user,字段有:id,name...
角色表role,字段有:id,name...
关联表userrole,字段有:userId,roleId
问:把角色名称为“研发人员”的用户“张三”从用户表中删除。
哪里错了呀?
DELETE FROM USER u
WHERE u.id=
(
SELECT u.id FROM USER u
JOIN userrole ur ON u.id=ur.userId
JOIN role r ON ur.RoleId=r.id
WHERE u.name='张三' AND r.name='研发人员'
);

10个回答

qq_33727653
qq_33727653   2017.09.19 11:21
已采纳

delete 不允许子查询有对同表的操作(具体怎么说忘了,大体那么个意思)!!!楼主可百度下:

 DELETE FROM USER u
WHERE u.id=
(
 SELECT t.id FROM
(
SELECT u.id FROM USER u
JOIN userrole ur ON u.id=ur.userId
JOIN role r ON ur.RoleId=r.id
WHERE u.name='张三' AND r.name='研发人员'
)t
);
qq_33727653
qq_33727653 找了下api 中文版是这么说的‘目前,您不能从一个表中删除,同时又在子查询中从同一个表中选择。’
2 个月之前 回复
qq_33727653
qq_33727653 DELETE t1 FROM t1,t2 WHERE t1.id=t2.id 这样的删除形式 试一试,楼主那样100%不行,我说的是delete语法要子查询对于同表要再包一层,并没有取校验语法,估计WHERE u.id 应该用in
2 个月之前 回复
nullyb
nullyb 回复砸死接触: 不太好使呀。
2 个月之前 回复
AAAAABBBBBYYYYY
AAAAABBBBBYYYYY   2017.09.19 08:53

改成这样试试
DELETE FROM USER user
WHERE user.id=
(
SELECT u.id FROM USER u
JOIN userrole ur ON u.id=ur.userId
JOIN role r ON ur.RoleId=r.id
WHERE u.name='张三' AND r.name='研发人员'
);
第一个USER 别命名为u了

theUncle
theUncle   Rxr 2017.09.19 16:26

DELETE FROM USER
WHERE id IN(SELECT id FROM
(SELECT u.id FROM USER u
LEFT JOIN userrole ur ON u.id=ur.userId
LEFT JOIN role r ON ur.roleId=r.id
WHERE u.name='张三' AND r.name='研发人员') tt
);

qq_35825178
qq_35825178   2017.09.19 08:36

where条件=改成in试试

nullyb
nullyb 回复qq_35825178: 不好使。
2 个月之前 回复
qq_35980546
qq_35980546   2017.09.19 08:53

userrole这个若是业务表的话可以直接做单表删除

torotsao
torotsao   2017.09.19 09:16

试试看这样
DELETE u
--SELECT u.id
FROM USER u
JOIN userrole ur ON u.id=ur.userId
JOIN role r ON ur.RoleId=r.id
WHERE u.name='张三' AND r.name='研发人员'

yitian881112
yitian881112   2017.09.19 09:30

u.id =()改成in试下,报什么错误,能贴下么,

nullyb
nullyb   2017.09.19 13:06

此为报错信息,上边说的,u.id=换成in不行。图片说明

theUncle
theUncle   Rxr 2017.09.19 16:12

必须用一条SQL语句写出来?按道理这里不是应该删除user表 和userrole表的信息吗?

nullyb
nullyb   2017.09.22 00:23

采纳的答案思路是正确的但是SQL语句编写有问题。
正确的:
DELETE FROM USER
WHERE id=
(
SELECT id FROM(
SELECT u.id FROM USER u
JOIN userrole ur ON u.id=ur.userId
JOIN role r ON ur.RoleId=r.id
WHERE u.name='张三' AND r.name='研发人员'
)a
);
错误:
DELETE FROM USER
WHERE id=
(
SELECT u.id FROM USER u
JOIN userrole ur ON u.id=ur.userId
JOIN role r ON ur.RoleId=r.id
WHERE u.name='张三' AND r.name='研发人员'
);
报错:
错误码: 1093
You can't specify target table 'USER' for update in FROM clause
当我们对a表进行delete或update操作时,from后不能再出现a表,所以再加一层。

Csdn user default icon
上传中...
上传图片
插入图片