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   Rxr 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 中文版是这么说的‘目前,您不能从一个表中删除,同时又在子查询中从同一个表中选择。’
10 个月之前 回复
qq_33727653
qq_33727653 DELETE t1 FROM t1,t2 WHERE t1.id=t2.id 这样的删除形式 试一试,楼主那样100%不行,我说的是delete语法要子查询对于同表要再包一层,并没有取校验语法,估计WHERE u.id 应该用in
10 个月之前 回复
nullyb
nullyb 回复砸死接触: 不太好使呀。
10 个月之前 回复
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: 不好使。
10 个月之前 回复
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
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
经典的SQL语句,适合新手练习使用(一)
1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sqlserver --- 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.
简单 sql 语句 实用大全
一、基础   1、说明:创建数据库   CREATE DATABASE database-name   2、说明:删除数据库   drop database dbname   3、说明:备份sql server   --- 创建 备份数据的 device   USE master   EXEC sp_addumpdevice 'disk', 'tes
自己编写sql语句分析工具
自己编写的,针对不同的sql语句,进行提取分析一些关键字。希望对大家有帮助。
微型Sql Server查询分析器、数据库比较工具,SQL语句编写助手
微型Sql Server查询分析器: 有时为了解决问题,需要执行SQL脚本,但是电脑上又没有装SQL SERVER,要下载,还要安装,十分麻烦。这个查询分析器是SQL Server 2000里提取出来的,压缩文件只有900多K,不需安装,功能足够,十分方便,技术人员或实施人员可放邮箱或U盘里,随时可用。 数据库比较工具: 可对SqlServer的两个数据库表结构等进行详细的比较,十分方便,小巧 SQL语句编写助手SQLAssistant: 对主流数据库Sql Server,Oracle,DB2,MySql,Access等都可用,写脚本或存储过程时提示功能十分强大,十分方便,包你爱不释手
编写最简单的SQL解析程序(原理演示)
如何写一个SQL解析器呢?这里先抛出第一步:单词切分。下面举个简单例子: select.l 文件: %{ /* nothing */ enum{ BEGIN_OF_INPUT = 0, SELECT, COLUMN, FROM, TABLE, SEP, END_OF_INPUT }; int state = BEGIN_OF_
写一个sql中视图和存储过程的简单创建和调用方法!!!自我备忘用····
刚才想写个存储过程,想不起语法了。在网上查了查找到了!!写完了又忘了怎么调用了 !晕死!···赶快写个简单备忘·······················select * from loginselect * from userinfoselect max(id) from loginselect * from login a,userinfo b where a.id=b.id
SQL非常全面的入门教程
SQL的入门教程,初学SQL的不可错过哦……
基于scala语言编写的SparkSQL
文档以scala语言编写了sparkSQL查询数据的方式,没有打jar包运行,在spark命令行测试通过
oracle数据库的简单查询语句
1、简单的查询语法 select [distinct] *| [as] [列别名],列名称 [as] [列别名] from 表名称 [表别名] [where 条件(s)] 执行顺序: 1、先执行from子句,确定要检索数据的来源 2、执行where子句,使用限定符对数据进行过滤 3、执行select子句,确定要检索出的数据列 distinct:去除重复的列,当查询两条记录的所有的列都相同
如何编写一个高效的sql语句
一.    序言 数据库的性能问题,一直以来都是困扰各个事业部的大问题。在性能问题中SQL语句的编写又是重中之重。因此,为提高各个事业部相应产品的执行效率,提高软件的性能,实现从功能要求到性能要求的转变,特编写此专题文章。 二.    SQL的优化器执行分析 在ORACLE RDBMS SERVER软件的内部,对于SQL语句的执行有一个优化器(OPTIMIZER)对SQL语句的执行进行优化。