本页主题: 妙用SQL子查询来从子表里删除数据 打印 | 加为IE收藏 | 复制链接 | 收藏主题 | 上一主题 | 下一主题

Yachtqi
级别: 管理员


精华: 2
发帖: 391
威望: 398 点
金钱: 3776 RMB
贡献值: 0 点
注册时间:2006-10-09
最后登录:2008-10-13

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

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


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

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

一个例子

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


表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查询里迭代。
顶端 Posted: 2007-02-09 19:45 | [楼 主]
nickey
级别: 论坛版主


精华: 0
发帖: 32
威望: 0 点
金钱: 320 RMB
贡献值: 0 点
注册时间:2007-03-26
最后登录:2008-03-20

 

delete from inventory  a join breed  b on a.breed_id=b.breed_id where b.breed_name = ‘Shitzu’
这样不就可以了?谁说join不能用的
顶端 Posted: 2007-03-26 10:24 | 1 楼
lirugift2008
级别: *


精华: *
发帖: *
威望: * 点
金钱: * RMB
贡献值: * 点
注册时间:*
最后登录:*

 天津电话录音卡诚征代理:15942081818(天津电话录音盒)

天津电话录音卡批发(1-256路)天津现货供应电话:15942081818!

【零售参考价格】:天津电话录音盒300元(1路)!天津电话录音盒380元(2路)!天津电话录音卡1200元(8路)!天津数字电话录音系统2400元(16路)!

【顺丰速递】航空运输,可以24小时货到天津,可支付宝购买!联系QQ:753396101 产品图片网址:www.lirugift.cn

天津电话监控!天津电话监听!天津电话录音器!1路2路4路8路16路电话录音卡!天津远程监听!天津电话录音dll接口免费下载!天津usb电话录音服务器!天津电话录音控件免费赠送!天津电话营销!天津先锋电话录音卡!天津电话录音软件免费下载,天津电话监听软件,联系QQ:753396101 最新产品价格及图片请访问:www.lirugift.cn

天津地区诚招代理,~量大价更优!周边市县可支付宝购买!大量现货款到当日发货!免费咨询:15942081818

电话录音取证受到法律支持!

  2002年4月1日最高人民法院《关于民事诉讼证据若干规定》(下称《规定》)正式实施,是我国第一部系统针对民事诉讼证据问题作出的司法解释。它规定:在民事诉讼中,有其他证据佐证并以合法手段取得的,无疑点的视听资料或者与视听资料核对无误的复印件,对方当事人提出异议但没有足以反驳的相反证据,人民法院应当确认其证明力。

  2002年4月4日,北京海淀区法院受理了“首例录音证据案”。该案涉及转租合同纠纷,被告续租期满未将原告已交付的押金予以返还,原告李女士在向被告提出请求返还时,做了秘密电话录音。对李女士提交的证据,海淀区法院予以接受。 

  朱某(男)与梁某(女)系自由恋爱结婚,而朱某家人对梁某长期不满,挑唆朱某与梁某离婚。山东省枣庄市山亭区法院判决不准予离婚后,2002年5月朱某再次起诉离婚。法院在开庭调查时,梁某称感情尚未破裂,并向法庭提交了2002年6月8日原告与被告手机电话录音。法庭当庭播放了该手机电话录音,其内容情意缠绵,原告朱某在通话中多次表示很“想”、很“爱”被告梁某,提起二人分手“就很伤心”。梁某认为朱某提出离婚是其家庭干涉。法院将原、被告的通话内容提交原告质证,原告无异议,法院予以认定,于近日作出判决,不准予原告朱某与被告梁某离婚宣判后,原被告均服从一审判决。 

  借据原件丢失 电话录音补救。法庭在庭审中查明,1999年12月14日,余召向王首借款9520元,定于2000年12月14日还清。借款到期后,余召除偿付1000元利息外,其余本息均未偿还。法院立案后,王首发现借据原件丢失。情急之下,王首于2001年9月8日找到余召,要求余召给自己出具一份“保证书”:保证所借现金9520元于2002年3月底还清。王首的女婿姚青看见“保证书”后,发现从“保证书”上根本不能证明余召是何时借何人9520元现金的,于是姚青在9月10日打电话给余召,余召在电话中讲明了自己对1999年12月14日借王首现金9520元不是不还,只是暂时没有偿还能力,而且他已经和王首达成了新的还款协议,保证在2002年3月底还清,并讲好了由王首马上撤诉。姚青对整个电话进行了录音。法庭经数次调查取证和开庭审理后认为,原告向法庭提交的电话录音资料虽然未经对方许可,但电话内容经其他证据佐证可以证明其真实无误,并且有被告出示的“保证书”相互印证原告诉讼主张真实。法庭遂判决被告偿清原告借款本金9520元及相应利息。 

  在具体操作过程中,一般期货交易所涉及的三大主体,即期货交易所、期货经纪公司、客户(投资者)之间常会在交易过程中的每个阶段而发生这样那样的纠纷。在期货交易中,由于期货交易的特性,视听资料在客户下单、竞价过程中常常出现;视听证据主要有:客户下单时的电话录音、期货经纪公司向场内代表下达指令的电话录音等。 

天津地区诚招代理,~量大价更优!周边市县可支付宝购买!大量现货款到当日发货!免费咨询:15942081818
顶端 Posted: 2008-06-04 07:45 | 辽宁省 2 楼
帖子浏览记录 版块浏览记录
承德互联 » 网络安全技术

Total 0.026361(s) query 7, Time now is:12-03 11:05, Gzip enabled
Powered by PHPWind v6.3.2 Certificate Code © 2003-08 PHPWind.com Corporation