同一张数据表中,有一列的结果是另一列和另一个计算列的结果,请问前辈们怎么实现

时间:2021-08-08 14:45:57
具体情况:
表A有列1,2,3,4
列2是1+3得到的(表A中的列1和列2)
而列3又是通过列4除以列2得到的
但是mssql数据库明显不让计算列引用另一个计算列
请问下各位前辈,这个问题能否在数据库里就解决,或者其他方法,谢谢了~!

17 个解决方案

#1


触发器可以实现,考虑吗?

#2


引用 1 楼 wmxcn2000 的回复:
触发器可以实现,考虑吗?

是在更新表A的时候进行再计算吗?

#3


用视图,或是将另一个计算列的公式复制过来。

#4


列2是1+3得到的(表A中的列1和列2)
而列3又是通过列4除以列2得到的



-- 逻辑上怎么解释?

列2 引用了 列3,列 3 又引用了 列2 ,互相引用了;

#5


这个逻辑怎么来的,先有列2还是列3?

#6


引用 4 楼 wmxcn2000 的回复:
列2是1+3得到的(表A中的列1和列2)
而列3又是通过列4除以列2得到的



-- 逻辑上怎么解释?

列2 引用了 列3,列 3 又引用了 列2 ,互相引用了;


我实际情况大概就是这个意思了,问题就是刚才我用了触发器,还是一样的不让我再引用计算列了

#7


引用 5 楼 Merry0101 的回复:
这个逻辑怎么来的,先有列2还是列3?

是先有的列2

#8


遇到这种问题是不是只能通过前台计算之后再写入数据库了?

#9


引用 6 楼 zz94263 的回复:
Quote: 引用 4 楼 wmxcn2000 的回复:

列2是1+3得到的(表A中的列1和列2)
而列3又是通过列4除以列2得到的



-- 逻辑上怎么解释?

列2 引用了 列3,列 3 又引用了 列2 ,互相引用了;


我实际情况大概就是这个意思了,问题就是刚才我用了触发器,还是一样的不让我再引用计算列了


不会的,你的触发器是怎么写的,表又是怎么定义的?

#10


引用 9 楼 wmxcn2000 的回复:
不会的,你的触发器是怎么写的,表又是怎么定义的?

同一张数据表中,有一列的结果是另一列和另一个计算列的结果,请问前辈们怎么实现
这个是我写的触发器
LD_YD_JXZL是计算列,而BM_LD_YD_JXZL又是要通过LD_YD_JXZL计算得来

#11



create table test(id int identity, c1 int, c2 int, c3 as c1 + c2, c4 int)
go
create trigger tri_test_ins
on test after insert, update
as
begin
    update test set c4 = c3 / 2 where id in (select id from inserted)
end
go
insert into test(c1, c2) values(100,200)
go
update test set c4 = c3 + 100
go
select * from test
go
drop table test 
go

(1 行受影响)
id          c1          c2          c3          c4
----------- ----------- ----------- ----------- -----------
1           100         200         300         150

(1 行受影响)


#12


引用 10 楼 zz94263 的回复:
这个是我写的触发器
LD_YD_JXZL是计算列,而BM_LD_YD_JXZL又是要通过LD_YD_JXZL计算得来



你把 inserted 取了别名了,系统会认为你要更新 inserted ,而不是更新原表;

#13


引用 12 楼 wmxcn2000 的回复:
你把 inserted 取了别名了,系统会认为你要更新 inserted ,而不是更新原表;


对了,原来是我写的代码,有问题,我也是网上复制过来,没好好研究,非常感谢
另外请教下,对于两张表的更新和插入触发器能写到一起吗?

#14


引用 13 楼 zz94263 的回复:
Quote: 引用 12 楼 wmxcn2000 的回复:

你把 inserted 取了别名了,系统会认为你要更新 inserted ,而不是更新原表;


对了,原来是我写的代码,有问题,我也是网上复制过来,没好好研究,非常感谢
另外请教下,对于两张表的更新和插入触发器能写到一起吗?


不可以,触发发器的主体是表,两个表的触发器,在逻辑上分开的;

#15


引用 14 楼 wmxcn2000 的回复:
Quote: 引用 13 楼 zz94263 的回复:

Quote: 引用 12 楼 wmxcn2000 的回复:

你把 inserted 取了别名了,系统会认为你要更新 inserted ,而不是更新原表;


对了,原来是我写的代码,有问题,我也是网上复制过来,没好好研究,非常感谢
另外请教下,对于两张表的更新和插入触发器能写到一起吗?


不可以,触发发器的主体是表,两个表的触发器,在逻辑上分开的;

知道了,最后请教一下,对于我这个贴的这种问题,触发器解决是否是最优或者最有效的呢?如果不是其他方法是什么?

#16


引用 15 楼 zz94263 的回复:
知道了,最后请教一下,对于我这个贴的这种问题,触发器解决是否是最优或者最有效的呢?如果不是其他方法是什么?


可以说是比较优的,但不是最有效的;

可以放在程序中,只是当这个逻辑发生变化时,要修改程序 ;

#17


引用 16 楼 wmxcn2000 的回复:
Quote: 引用 15 楼 zz94263 的回复:


知道了,最后请教一下,对于我这个贴的这种问题,触发器解决是否是最优或者最有效的呢?如果不是其他方法是什么?


可以说是比较优的,但不是最有效的;

可以放在程序中,只是当这个逻辑发生变化时,要修改程序 ;


学习了,非常感谢!

#1


触发器可以实现,考虑吗?

#2


引用 1 楼 wmxcn2000 的回复:
触发器可以实现,考虑吗?

是在更新表A的时候进行再计算吗?

#3


用视图,或是将另一个计算列的公式复制过来。

#4


列2是1+3得到的(表A中的列1和列2)
而列3又是通过列4除以列2得到的



-- 逻辑上怎么解释?

列2 引用了 列3,列 3 又引用了 列2 ,互相引用了;

#5


这个逻辑怎么来的,先有列2还是列3?

#6


引用 4 楼 wmxcn2000 的回复:
列2是1+3得到的(表A中的列1和列2)
而列3又是通过列4除以列2得到的



-- 逻辑上怎么解释?

列2 引用了 列3,列 3 又引用了 列2 ,互相引用了;


我实际情况大概就是这个意思了,问题就是刚才我用了触发器,还是一样的不让我再引用计算列了

#7


引用 5 楼 Merry0101 的回复:
这个逻辑怎么来的,先有列2还是列3?

是先有的列2

#8


遇到这种问题是不是只能通过前台计算之后再写入数据库了?

#9


引用 6 楼 zz94263 的回复:
Quote: 引用 4 楼 wmxcn2000 的回复:

列2是1+3得到的(表A中的列1和列2)
而列3又是通过列4除以列2得到的



-- 逻辑上怎么解释?

列2 引用了 列3,列 3 又引用了 列2 ,互相引用了;


我实际情况大概就是这个意思了,问题就是刚才我用了触发器,还是一样的不让我再引用计算列了


不会的,你的触发器是怎么写的,表又是怎么定义的?

#10


引用 9 楼 wmxcn2000 的回复:
不会的,你的触发器是怎么写的,表又是怎么定义的?

同一张数据表中,有一列的结果是另一列和另一个计算列的结果,请问前辈们怎么实现
这个是我写的触发器
LD_YD_JXZL是计算列,而BM_LD_YD_JXZL又是要通过LD_YD_JXZL计算得来

#11



create table test(id int identity, c1 int, c2 int, c3 as c1 + c2, c4 int)
go
create trigger tri_test_ins
on test after insert, update
as
begin
    update test set c4 = c3 / 2 where id in (select id from inserted)
end
go
insert into test(c1, c2) values(100,200)
go
update test set c4 = c3 + 100
go
select * from test
go
drop table test 
go

(1 行受影响)
id          c1          c2          c3          c4
----------- ----------- ----------- ----------- -----------
1           100         200         300         150

(1 行受影响)


#12


引用 10 楼 zz94263 的回复:
这个是我写的触发器
LD_YD_JXZL是计算列,而BM_LD_YD_JXZL又是要通过LD_YD_JXZL计算得来



你把 inserted 取了别名了,系统会认为你要更新 inserted ,而不是更新原表;

#13


引用 12 楼 wmxcn2000 的回复:
你把 inserted 取了别名了,系统会认为你要更新 inserted ,而不是更新原表;


对了,原来是我写的代码,有问题,我也是网上复制过来,没好好研究,非常感谢
另外请教下,对于两张表的更新和插入触发器能写到一起吗?

#14


引用 13 楼 zz94263 的回复:
Quote: 引用 12 楼 wmxcn2000 的回复:

你把 inserted 取了别名了,系统会认为你要更新 inserted ,而不是更新原表;


对了,原来是我写的代码,有问题,我也是网上复制过来,没好好研究,非常感谢
另外请教下,对于两张表的更新和插入触发器能写到一起吗?


不可以,触发发器的主体是表,两个表的触发器,在逻辑上分开的;

#15


引用 14 楼 wmxcn2000 的回复:
Quote: 引用 13 楼 zz94263 的回复:

Quote: 引用 12 楼 wmxcn2000 的回复:

你把 inserted 取了别名了,系统会认为你要更新 inserted ,而不是更新原表;


对了,原来是我写的代码,有问题,我也是网上复制过来,没好好研究,非常感谢
另外请教下,对于两张表的更新和插入触发器能写到一起吗?


不可以,触发发器的主体是表,两个表的触发器,在逻辑上分开的;

知道了,最后请教一下,对于我这个贴的这种问题,触发器解决是否是最优或者最有效的呢?如果不是其他方法是什么?

#16


引用 15 楼 zz94263 的回复:
知道了,最后请教一下,对于我这个贴的这种问题,触发器解决是否是最优或者最有效的呢?如果不是其他方法是什么?


可以说是比较优的,但不是最有效的;

可以放在程序中,只是当这个逻辑发生变化时,要修改程序 ;

#17


引用 16 楼 wmxcn2000 的回复:
Quote: 引用 15 楼 zz94263 的回复:


知道了,最后请教一下,对于我这个贴的这种问题,触发器解决是否是最优或者最有效的呢?如果不是其他方法是什么?


可以说是比较优的,但不是最有效的;

可以放在程序中,只是当这个逻辑发生变化时,要修改程序 ;


学习了,非常感谢!