妙用SQL子查询来从子表里删除数据

2016-01-29 15:49 234 1 收藏

妙用SQL子查询来从子表里删除数据,妙用SQL子查询来从子表里删除数据

【 tulaoshi.com - SQLServer 】

在这篇文章里我要描述一下如何从表格里删除列,要删除的这些列同时还要依赖于其他表格的标准。要解决这个问题就需要一个很聪明而且完全遵守SQL92子查询声明的应用程序。

我必须提醒读者的是,尽管查询可能会遵守SQL的标准,但是众多的数据库生产商会以不同的句法支持实现SQL。以下这个解决方案应该适合于大多数数据库;但是,如果你的结果有出入,就还是应该查看一下文档。同时,由于这个查询要处理DELETE声明,所以你应该在将其应用于真实的生产环境以前在实验数据上进行测试。

一个例子

要解释如何进行这种类型的列删除,我会使用如下这个数据库的表格,该数据库叫做PetStore,并包含有清单(inventory)信息。在叫做“品种(breed)”的表A里,我存储有每种动物的信息和宠物店库存的信息。在叫做“清单”的表B里,包含有商店里特定动物的信息。

表A 品种

妙用SQL子查询来从子表里删除数据

表B 清单

妙用SQL子查询来从子表里删除数据

在这个例子里,我们先假设商店把整窝Shitzu小狗都卖完了。我可以使用breed表格里的breed_id字段来删除Shitzu清单里的所有项目,就像这样:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/sqlserver/)

DELETE FROM inventory WHERE breed_id IN(SELECT breed_id FROM breed WHERE breed_name = ‘Shitzu’);

首先,我要指定需要删除记录的表格,在这里是清单表格。然后再将识别字段breed_id同子选项子句的结果反复比对。我知道要找的是Shitzus,所以就能直接删掉他们,而不用再在单独的请求里查询breed_id。

我必须要警告你的是,以这种方式使用DELETE声明是危险的,只有在你对数据库的结构很熟悉的情况下才能使用这些声明。DELETE查询会从受影响的表格里删除掉全部列,你应该知道这对你所管理着的数据意味着什么。有个好办法是使用SELETE *这个短语替代DELETE关键字来对DELETE声明的子查询结果进行测试,这样就能保证结果里含有你要删除的所有东西,就像这样:

SELECT * FROM inventory WHERE breed_id IN(SELECT breed_id FROM breed WHERE breed_name = ‘Shitzu’);

DELETE和JOIN联用

有人问到了解决这个问题另一个可能的办法:把JOIN子句和DELETE声明联合使用。由于以前没有使用过这种方法,我就研究了一下,发现SQL Server的文档声明支持这个方法,尽管它不符合SQL92。在经过测试和询问各种数据库平台的老手之后,我发现把DELETE和JOIN声明联合使用在我测试过的任何平台上都行不通。

从多个表格里一次删除

以上的解决方案还没有解释如何使用父表从多个子表里删除信息。但是SQL92规范里没有提供完成这项任务的标准解决方案。

DELETE的声明不能把多个表格作为一个参数接受。作为一个具有破坏性的查询,这能保证在命令要被执行的地方不会出现歧义。此外,这个限制防止了在单个声明内将AND和多个子查询联用。如果测试SELECT声明的结果用以检查DELETE查询将要影响到的是哪些数据,你会发现SELECT会返回多个表格的清单,DELETE不会影响到的多个子查询不在其中。

有很多可能的方法能够满足你的需求,例如在表格里创建一个字段,用以指明该项目是否为活动的。或者,你可以使用一些数据库里的预存程序在每个所需的DELETE查询里迭代。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/sqlserver/)

来源:http://www.tulaoshi.com/n/20160129/1496523.html

延伸阅读
SQL Server中误删除数据的恢复本来不是件难事,从事务日志恢复即可。但是,这个恢复需要有两个前提条件: 1. 至少有一个误删除之前的数据库完全备份。 2. 数据库的恢复模式(Recovery mode)是“完全(Full)”。 针对这两个前提条件,会有三种情况: 情况一、 如果这两个前提条件都存在,通过SQL语句只需三步就能恢复(参考文章),...
数据表的删除比较简单,表删除后其占用的空间就被系统释放和回收,表的删除是无法回滚的操作。可删除的内容包括。 表的定义 表中的数据 表中的索引 表中的约束条件 表上的触发器 表中的权限 在里删除表 (1)如图7.35所示。 (2)出现如图7.36所示界面。 (3)对应上述删除数据表director的SQL代码为...
标签: SQLServer
  方法一 declare @max integer,@id integer declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) 1 open cur_rows fetch cur_rows into @id,@max while @@fetch_status=0 begin select @max = @max -1 set rowcount @max delete from 表名 where 主字段 = @id fetch cur_rows into ...
标签: SQLServer
  作为数据库的开发者,我们经常面临着要找出及删除数据库中冗余数据的任务,如果数据库中有大量的冗余数据(占总数的百分比太多),数据的精确性和可靠性将受到影响,同时也影响着数据库的性能,那么如何解决这个问题呢?下面我将探讨关于这个问题的这个解决方案,oracle也为我们提供了一个解决方案,但是Oracle提供的解决方案不...
标签: 网络
恢复数据     如何恢复数据库?网站管理员在重装服务器系统或者迁移完服务器后需要恢复数据库,下面给大家介绍的是批量恢复MySQL数据库方法,该方法适用于迁移服务器后批量恢复数据库,以及本机重做系统后批量恢复数据库。 批量恢复 1、备份MySQL 先停止MySQL,再把MySQL的data目录完全备份(复制Data目录到其他地方)。 2、恢复数据...

经验教程

169

收藏

99
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部