一条删除的sql语句问题

tristsesame 2003-09-27 09:46:04
有二张相关连的表,存在着一对多的关系.
例如:
一个帐号表
一个用户表
一个帐号可以建多个用户.
在对用户表进行删除时,
如果某个帐号的所有用户都被删除,则也删除帐号表中的相关记录.

我现在的问题是,在删除用户表中记录时,怎么判断和其相关的帐号是否应该删除.
如果该帐号还有相关连的别的用户记录不属于被删除之列.则不删除该帐号.

我用了个
DELETE FROM 帐号表 WHERE account_id IN
(
select a.account_id FROM 用户表 a LEFT OUTER JOIN 帐号表 b ON a.account_id = b.account__id
WHERE 条件
AND a.account_id NOT IN
(SELECT a.account_id FROM 用户表 a LEFT OUTER JOIN 帐号表 b ON
a.account_id = b.accont_id
WHERE not(条件)
)

总觉得这样似乎不好.
但一时又不知怎样写才好.
请大家帮忙.
...全文
132 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tristsesame 2003-09-27
  • 打赏
  • 举报
回复
我列一下表结构
如:
帐号表account:
字段 account_id

用户表:user
字段 user_id
字段 account_id
字段 master

如果master=1,则视为主用户
如果master=0,则视为副用户
删除副用户不影响帐号记录
但如果删除主用户,则将删除相关的帐号及所有副用户

所以在我删除用户表记录时,只是先删除master=0的记录

然后再删除帐号表中记录.
那些master=1的记录是通过帐号表的delete触发器来做的
删除掉某条帐号时,触发器将删除与之相关连的用户表的记录.

我现在头痛的地方就是

在删除掉满足条件的用户表中记录时.
除了查询到所有和其相关连的account_id

还需要在不满足条件的用户表记录中看是否存在此account_id中对应的用户表记录
如果存在且其master=1,则在欲删除的帐号记录中剔除掉那条记录

不知这样说的清不清楚,:)
IceRiver_11 2003-09-27
  • 打赏
  • 举报
回复
用触发器是最简便的了!如果不用触发器的话可以这样:
DELETE FROM 帐号表
WHERE (select count(*) from 用户表 as
where account_id=刚删除用户对应的帐号)=0
and
account_id=刚删除用户对应的帐号
yujohny 2003-09-27
  • 打赏
  • 举报
回复

你用触发器来删除就好了
CREATE TRIGGER test ON 用户表
FOR DELETE
AS
IF NOT EXISTS(SELECT 1 FROM 用户表
WHERE account_id IN (select account_id FROM DELETED)
DELETE FROM 帐号表
WHERE account_id IN (select DISTINCT account_id FROM DELETED)
aierong 2003-09-27
  • 打赏
  • 举报
回复
当然用触发器

也可以

这样就是自动运行啦
aierong 2003-09-27
  • 打赏
  • 举报
回复


create table 用户表(account_id int)
insert into 帐号表 select 1
insert into 帐号表 select 2
insert into 帐号表 select 3
insert into 用户表 select 1
insert into 用户表 select 2
insert into 用户表 select 2
go

DELETE FROM 帐号表
WHERE (select count(*) from 帐号表 as a join 用户表 as b on a.account_id=b.account_id)=0

if @@rowcount>0
print 'del ok'
mjhnet 2003-09-27
  • 打赏
  • 举报
回复
CREATE TRIGGER Delete_Account
ON 用户表
FOR DELETE
AS
if not exists(select * from 帐号表 where 帐号 in (select 帐号 from deleted) and 用户<>deleted.用户)
delete from 帐号表 where 帐号 = deleted.帐号
zosky 2003-09-27
  • 打赏
  • 举报
回复
gz
tristsesame 2003-09-27
  • 打赏
  • 举报
回复
我首先要通过条件查找到欲删除的用户记录对应的帐号id

然后再排除掉其中不应该删除的帐号id

通过查询在不满足删除条件的用户记录中是否有相关的帐号id存在于前的的查询结果中,
如果有,则去掉对应的那条记录

这个和级联删除似乎并无关系.
Stone444 2003-09-27
  • 打赏
  • 举报
回复
用级联删除,级联更新就可以了呀
tristsesame 2003-09-27
  • 打赏
  • 举报
回复
问了一下同事,
问题已经解决了.


delete掉欲删除用户表中master=0的记录

delete帐号表中account_id in(欲删除的用户表中的account_id)

帐号中的delete触发器会删除相关连的用户表记录

谢谢大家

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧