数据库删除行写不了第二行,怎么办?

查看: 9122|回复: 21
SQL 怎么实现第一行数据减去第二行数据?
论坛徽章:0
入库&&出存&&(这个是我希望得出的)
10& &&&0& && && & 10
10& &&&3& && && & 17
第一行的 最后的数是 入库-出库,得出的一个新列数据
第二行的新列数据是(第一行的新列+第二行入库-出库)
-------------------
这是我的代码
select a.id,a.indate,a.item,sum(a.qty) as inqty,sum(outqty) as outqty,sum(a.qty-outqty) as zh from
& && && && && && &(select a.id,a.item,b.indate,a.qty,outqty=0,tag='A'&&
from in2 a left join in1 b on a.id=b.id where a.item='联塑')
& && &&&union all
(select c.id,c.item,d.outdate as indate,qty=0,c.qty as outqty,tag='B'
from out2 c left join out1 d on c.id=d.id where c.item='联塑')&&
& && && & ) a
group by a.id,a.item,a.indate,a.tag
order by a.tag
---------------下面结果
00:00:00.000& & 联塑 15.00& & & & .00& & & & 15.00& & & &
00:00:00.000& & 联塑 .00& & & & 15.00& & & & -15.00& & & &
----------------------
我得出的结果是-15的,但这不是我想要的.我要的是
==========大侠们帮我修改下吧
[ 本帖最后由 svcce 于
13:13 编辑 ]
论坛徽章:0
求答案啊。大虾们
论坛徽章:0
select in,
& && && & out,
& && && & sum(left) over(order by left rows between unbounded preceding and current row) as result
& && && && & select t.in,t.out,(t.in-t.out) as left From t)
[ 本帖最后由 fastdual 于
12:46 编辑 ]
论坛徽章:0
回复 #3 fastdual 的帖子
大虾.帮我改下代码吧.我没看懂你的这段代码!
论坛徽章:66
什么叫第一行数据?关系数据库根本没这个概念。
论坛徽章:0
回复 #5 wolfop 的帖子
额.是我不太会表达!你看看我的代码吧!
论坛徽章:51
select num_in,num_out,sum(left) over(order by left rows between unbounded preceding and current row) as result
&&2& && && && &from (select num_in,num_out,num_in-num_out as left from a);
& & NUM_IN& & NUM_OUT& &&&RESULT
---------- ---------- ----------
& && &&&10& && && & 5& && && & 5
& && &&&10& && && & 0& && && &15
三楼的意思就是利用分析函数来解决的
其实你这个还是很有规律的~就是前两列的差然后再累积求和
他先算出你的前两列的差,然后用个分析函数实现累积求和就OK了
论坛徽章:0
回复 #7 iori809 的帖子
额.郁闷的说.还是不懂.能帮我修改代码嘛?
认证徽章论坛徽章:9605
用分析函数
论坛徽章:0
itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号: 广播电视节目制作经营许可证:编号(京)字第1149号安装SQL数据库的问题?点击安装SQL的时候没有任何反应再点第二 - 爱问知识人
(window.slotbydup=window.slotbydup || []).push({
id: '2491531',
container: s,
size: '150,90',
display: 'inlay-fix'
安装SQL 数据库的问题?
的时候
没有任何反应
再点第二次的时候出现“另一个安装程序实例已在运行”
等了半天还是没有半点反应
谁能告诉我这是怎么回事吗?
我不大懂这个东西!
以前装的时候没出现过这种问题
先删除,然后再安装一下。
您的举报已经提交成功,我们将尽快处理,谢谢!
我知道的也不多,希望对你有帮助。如:在a2中求b2到h2的和,在a2中输入公式:=sum(b2:h2),当b2到h2没有数据时会显示0,如果在a2中输入公式:=...
删除注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager下的Pendin...
您好,这个应该是系统冲突了!
ps钢笔使用教程:
里面很详细的说明了
个人觉得是系统问题,建议重装系统比较好,希望我的回答可以帮到你,如果我的回答对你有帮助请点好评谢谢。
大家还关注4870人阅读
数据库(12)
本人水平有限,写此博客只为给那些像我一样的菜鸟一点小小的帮助,还请各位大牛不要见笑。
数据库的重要性就不用我多说了吧,我们做的大多数项目都要跟数据库打交道。因此,熟练掌握数据库的各种操作,就成了一个程序员必备的技能。今天我们就来简单说一下触发器。
触发器简介:
触发器(trigger)是种特殊的存储过程,它的执行不是由程序调用,也不需要手动操作,它是由事件来触发,事件大家应该非常熟悉吧,比如按钮的Click事件、网页的Load事件等。按钮的Click事件是通过鼠标单击按钮触发的,而触发器的事件,是由对表进行增删改操作所触发的。当对一个数据库或表进行增删改(
Insert,Delete,Update)的时就会激活触发器。
从SQL2005开始,根据SQL语句的不同将触发器分成了两类,一类是DML触发器,一类是DLL触发器。其中DML触发器又分为两类:After触发器和Instead Of触发器。
触发器的分类:
DML触发器:DML(Data Manipulation Language)触发器是当数据库服务器中发生数据操作语言事件时执行的存储过程。DML触发器又分为两类:After触发器和Instead
DDL触发器:DDL触发器是在响应数据定义语言(Data Definition Language)事件时执行的存储过程。DDL触发器一般用于执行数据库中管理任务。如审核和规范数据库操作、防止数据库表结构被修改等。
DML触发器:
今天我们我们主要介绍DML触发器,DML触发器分为After触发器和Instead Of触发器。
After触发器:这类触发器是在记录已经改变完之后(after),才会被激活执行,它主要是用于记录变更后的处理或检查,一旦发现错误,也可以用Rollback
Transaction语句来回滚本次的操作。
Instead Of触发器:这类触发器一般是用来取代原本的操作,在记录变更之前发生的,它并不去执行原来SQL语句里的操作(Insert、Update、Delete),而去执行触发器本身所定义的操作。
在SQL Server里,每个DML触发器都分配有两个特殊的表,一个是Inserted表,一个是Deleted表。它们两个存在于数据库服务器的内存中,是由系统管理的逻辑表,是两个临时表,而不是真正存储在数据库中的物理表。用户对这两个表只有读取的权限,没有修改的权限。
这两个表的结构(主外键、字段、数据类型等)与触发器所在数据表的结构是完全一致的,当触发器的工作完成之后,这两个表也将会从内存中删除。
Inserted和Deleted两个表的作用:
Inserted:对于插入记录操作来说,插入表里存放的是要插入的数据;对于更新记录操作来说,插入表里存放的是要更新的记录。
Deleted:对于更新记录操作来说,删除表里存放的是被更新记录;对于删除记录操作来说,删除表里存入的是被删除的旧记录。
看上面两句话可能不太明白,那么看看下面这张表是不是就明白了?
工作原理:
After触发器的工作原理:
After触发器是在SQL语句执行之后才被激活的。以删除记录为例:当SQL Server接收到一条删除操作的SQL语句时,SQL Server先将要删除的记录存放在Deleted表里,然后把数据表里的记录删除,再激活After触发器,执行After触发器里的SQL语句。执行完毕之后, 删除内存中的Deleted表,操作结束。
还是举上面的例子:在产品库存表里,如果要删除一条产品记录,在删除的时候,触发器可以检查该产品库存数量是否为零,如果不为零则取消删除操作。数据库的操作如下:
1,接收SQL语句,将要从产品库存表里删除的产品记录取出来,放在删除表里。
2,从产品库存表里删除该产品记录。
3,从删除表里读出该产品的库存数量字段,判断是不是为零,如果为零的话,完成操作,从内存里清除删除表;如果不为零的话,用Rollback Transaction语句来回滚操作(即将库存表还原成删除之前的状态)。
Instead Of 触发器的工作原理:
Instead Of触发器与After触发器不同。After触发器是在Insert、Update和Delete操作完成后才激活的,而Instead Of触发器,是在这些操作进行之前就激活了,并且不再去执行原来的SQL操作,而是用触发器本身的SQL语句代替原来的语句去执行。
还拿上面那个例子来说,删除一条产品记录的时候,用Instead Of将删除操作替换成查询该产品的库存。数据库的操作如下:
1,接收SQL语句,但不执行,而是跳转到Instead Of后面的SQL语句
2,根据传入的产品ID,将该产品的库存取出,完成操作。
说了那么多理论上的东西,下面让我们看看触发器的代码到底怎么写:
下面的一段代码是触发器的一个框架。
CREATE TRIGGER
Trigger_Name --触发器名,在一个数据库中触发器名是唯一的。
Table_Name | View_Name --触发器所在的表或者视图。
AFTER(FOR)|Instead Of
INSERT,DELETE,UPDATE --定义成AFTER或Instead Of类型的触发器。
--AFTER跟FOR相同,不可在视图上定义AFTER触发器
-- 后面是触发器被触发的条件,最少有一个,可以邮多个。如果有多个用逗号分开,顺序无要求。
AS --触发器要执行的操作
--BEGIN跟END组成一个代码块,可以写也可以不写,如果触发器中执行的SQL语句比较复杂,用BEGIN和END会让代码更加整齐,更容易理解。
GO --GO就代表结操作完毕
注意事项:
1,After触发器只能用于数据表不能用于视图;Instead Of触发器两者皆可,设置为With Check Option的视图也不允许建立Instead Of触发器。两种触发器都不可以建立在临时表上。
2,一个数据表可以有多个触发器,但是一个触发器只能对应一个表。
3,在同一个数据表中,对每个操作(如Insert、Update、Delete)而言可以建立许多个After触发器,而Instead Of触发器针对每个操作只有建立一个。
4,如果针对某个操作即设置了After触发器又设置了Instead Of触发器,那么Instead of触发器一定会激活,而After触发器就不一定会激活。
5,不同的SQL语句,可以触发同一个触发器,如Insert和Update语句都可以激活同一个触发器。
6,触发器名在所在的数据库里必须是唯一的。由于触发器是建立中数据表或视图中的,所以有很多人都以为只要是在不同的数据表中,触发器的名称就可以相同,其实触发器的全名(Server.Database.Owner.TriggerName)是必须 唯一的,这与触发器在哪个数据表或视图无关。
7,关键字AFTER可以用For来代取,它们的意思都是一样的,代表只有在数据表的操作都已正确完成后才会激活的触发器。
关于触发器就简单介绍到这里,有什么不足还请各位不吝赐教!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1115440次
积分:22635
积分:22635
排名:第230名
原创:210篇
评论:4763条
阅读:30309
阅读:33911
文章:19篇
阅读:109748
文章:10篇
阅读:65506
阅读:37047
文章:11篇
阅读:224251
阅读:35917
(1)(2)(1)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(2)(4)(4)(4)(4)(4)(4)(4)(4)(5)(4)(4)(4)(4)(4)(4)(2)(5)(5)本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 数据库删除行 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信