跟我学SQL:从子表里删除数据

在这篇文章里我要描述一下如何从表格里删除列,要删除的这些列同时还要依赖于其他表格的标准。要解决这个问题就需要一个很聪明而且完全遵守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查询里迭代。

时间: 2024-08-30 10:36:40

跟我学SQL:从子表里删除数据的相关文章

跟我学SQL:(七)从子表里删除数据

数据 在这篇文章里我要描述一下如何从表格里删除列,要删除的这些列同时还要依赖于其他表格的标准.要解决这个问题就需要一个很聪明而且完全遵守SQL92子查询声明的应用程序.   我必须提醒读者的是,尽管查询可能会遵守SQL的标准,但是众多的数据库生产商会以不同的句法支持实现SQL.以下这个解决方案应该适合于大多数数据库:但是,如果你的结果有出入,就还是应该查看一下文档.同时,由于这个查询要处理DELETE声明,所以你应该在将其应用于真实的生产环境以前在实验数据上进行测试. 需要更多的背景信息? 查看

h2 删数据 sql优化-h2数据库删除数据速度问题

问题描述 h2数据库删除数据速度问题 想删除h2数据库中某个表部分数据,但该表中有八千万左右数据,如何删除符合要求的一小部分数据呢?比如删除name以abc开头的数据,因为h2数据库我是通过web打开查看的,普通的Sql语句要执行很长很长时间,而且经常报内存不足,各位大神有没有什么优化的方法???求指点呀 解决方案 http://www.lc365.net/blog/b/32424/ 解决方案二: 因为没分了,不过谢谢能回答,对我其他的一些地方有帮助

MS SQL基础教程:删除数据

11.2.1 DELETE 语法 DELETE 语句用来从表中删除数据,其语法为: 各参数说明如下: FROM 此参数为可选选项,用于连接DELETE 关键字和要删除数据的对象名称. table_name 指定要删除数据的表. WITH ( [...n]) 指定一个或多个目标表允许的表提示. view_name 指定用于删除数据的视图. rowset_function_limited 行集合函数限制,即使用OPENQUERY() 或OPENROWSET() 函数. FROM 指定一个额外的FRO

SQL建立数据库及删除数据库命令_MsSql

复制代码 代码如下: CREATE DATABASE 临时的 ON ( NAME='临时的_Data', FILENAME='h:\临时的.mdf', SIZE=5MB, MAXSIZE=50MB, FILEGROWTH=10% ) LOG ON ( NAME='临时的_LOG', FILENAME='h:\临时的.ldf', SIZE=2MB, MAXSIZE=5MB, FILEGROWTH=1MB ) 这样就在H盘建立了一个名字为 临时的.mdf,以及日志名称为 临时的.ldf的数据库文件,

SQL建立数据库及删除数据库命令

复制代码 代码如下: CREATE DATABASE 临时的 ON ( NAME='临时的_Data', FILENAME='h:\临时的.mdf', SIZE=5MB, MAXSIZE=50MB, FILEGROWTH=10% ) LOG ON ( NAME='临时的_LOG', FILENAME='h:\临时的.ldf', SIZE=2MB, MAXSIZE=5MB, FILEGROWTH=1MB ) 这样就在H盘建立了一个名字为 临时的.mdf,以及日志名称为 临时的.ldf的数据库文件,

批量删除数据方法

在一个Oracle数据库运行过程中,有时候会遇到要批量删除数据的情况,如一个保存历史数据的表中有大量的数据已经不需要保留,要将这部分数据删除.通常采用的方法如下: 1.使用TRUNCATE命令进行删除. 如果是整个表的数据都要删除的话,使用TRUNCATE TABLE命令是理想的选择.它删除了表中的所有数据,并且因为不写REDO LOG FILE,所以速度很快.删除的同时,表的索引和约束条件仍然存在.这种方法适用于ORACLE的各个版本.但是当要删除的数据只是表中的一部分时,这种方法便行不通了.

图片-Sql Server 2008 R2 删除后重装卡死问题!

问题描述 Sql Server 2008 R2 删除后重装卡死问题! 我家是Win32的PC,用VM/Windows Server 2003 安装SQL Server 2008 R2 的时候到最后一步安装进度的时候卡死在Install_BDL_Cpu32_Action 这里,之前安装可以的,然后因为VM的内存不够,我就删除了原来已经装好的VM重新整理好磁盘之后在打开VM就这样了. 1:重装系统无效. 2:换一个版本安装也无效. 3:清理了所有注册表里的文件也无效. 4:百度的方法都试过了,无效!

我用vs2005+sql2000做了一个系统,现在想将所有sql中更新、删除操作都记录下来,并将改的时间和修改人姓名都保存起来,怎么做?给个思路

问题描述 我用vs2005+sql2000做了一个系统,现在想将所有sql中更新.删除操作都记录下来,并将改的时间和修改人姓名都保存起来,怎么做?给个思路.比如一个页面,由张三修改了,自动将修改的记录记录下来,软件的页面很多,不想一个一个去写,想找一个简单的方法,听说sql中触发器可以做到,请高手指点. 解决方案 解决方案二:你可以使用触发器,但是你的每个表里都能记录操作用户信息么?触发器可以记录修改前和修改后还有修改时间解决方案三:在系统中定义一个用于写记录的类同时定义一个静态类该静态类知道当

用SQL删除数据

  使用[delete]命令可以删除数据,使用[truncate]命令可以删除整表数据但保留结构.4.7.1 删除记录    在[命令编辑区]输入"delete from scott.test where empno>=7500 and empno<=8000;",然后单击[执行]按钮,出现如图4.47所示的结果.    [参见光盘文件]:\第4章\4.7\471.sql.    删除记录的语法:delete from 数据表 where 条件.4.7.2 整表数据删除