设为首页
加入收藏
广告投放
 | 网站首页 | 安全资讯 | 技术文章 | 下载中心 | 图片中心 | 网络技术 | 网站建设 | 精品图书 | 访客留言 | 网管论坛 | 

  没有公告

今天是:
| 新手学堂 | 操作系统 | 数据库 | 邮件系统 | 防火墙 | 系统安全 | 方案设计 | 视频教程 | 网站推广 | 认证考试 |
| 系统优化 | 硬件学堂 | 专家答疑 | 管理脚本 | 存储备份 | 交换路由 | ISA Server | 网管专区 | 推荐书籍 | 加密破解 |
| 办公教程 | SQL Server | Exchange 教程 | Photoshop | HTML 教程 | CSS 教程 | Dreamweaver| Flash教程 | ASP教程 |
您现在的位置: 天下网管联盟 >> 技术文章 >> 软件应用 >> 数据库 >> SQL Server >> 文章正文
跟我学SQL:(七)从子表里删除数据         ★★★
跟我学SQL:(七)从子表里删除数据
副标题:
作者:未知 文章来源:天下网管联盟 点击数: 更新时间:2006-8-5
在这篇文章里我要描述一下如何从表格里删除列,要删除的这些列同时还要依赖于其他表格的标准。要解决这个问题就需要一个很聪明而且完全遵守SQL92子查询声明的应用程序。   
我必须提醒读者的是,尽管查询可能会遵守SQL的标准,但是众多的
数据库生产商会以不同的句法支持实现SQL。以下这个解决方案应该适合于大多数数据库;但是,如果你的结果有出入,就还是应该查看一下文档。同时,由于这个查询要处理DELETE声明,所以你应该在将其应用于真实的生产环境以前在实验数据上进行测试。

需要更多的背景信息? 
查看这些文章就能快速上路: 
《SQL基础I查数据查询》涉及到了DELETE查询的使用。
《使用SQL子选项来合并查询》说明子选项查询能够减少对数据库请求的数量,并提供了例子。
《SQL基础:查询多个表》提供了更多关于子选项的信息,还讲到了使用单个查询就能访问多个表格的多种其他方法。

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

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

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.99191.com
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    推荐文章[组图]Windows Server活
    普通文章网速变慢的故障分析
    普通文章做个优秀网管,掌握局域
    普通文章[组图]从网吧ARP欺骗看
    推荐文章[组图]如何配置RAID磁盘
    普通文章使用GHOST备份/恢复系统
    普通文章收藏到一个极好的 DLL 
    普通文章XP系统网络网上邻居不能
    推荐文章[组图]Windows Server活
    推荐文章[组图]Windows Server活
    推荐文章[组图]Windows Server活
    推荐文章[组图]如何配置RAID磁盘
    推荐文章阻止Exchange服务器开放
    推荐文章[组图]备份与恢复Win20
    推荐文章[组图]WIN2000中如何 利
    推荐文章DNS在活动目录中的使用
    SQL 语法参考手册
    让你的SQL运行速
    跟我学SQL:(九)
    跟我学SQL:(八)
    跟我学SQL:(六)

    个人家庭电脑安全登

    最简单有效的提高Wi

    导出、备份,导入、恢

    加密vbs脚本中的代码
    (只显示最新10条。评论内容只代表网友观点,与本站立场无关!)