sql计算更新,a表条件满足b表条件,取b表公式计算
用update语句如何表达条件:a表的客户,客户性质,商品名称=b表的客户,客户性质,商品名称并且a表的重量要符合b表的重量段,即a表的重量>=最低重量and重量<=最高...
用update语句如何表达
条件:a表的客户,客户性质,商品名称=b表的客户,客户性质,商品名称 并且a表的重量要符合b表的重量段,即a表的重量>=最低重量 and 重量<=最高重量
满足条件的结果把表达式的值更新到金额,比如上面的订单号1取的公式是 #(x/0.5)*1.5
其中b表中的公式#代表ceiling函数,x是重量变量,比如上面的30.88计算结果就是93
在过程中如何声明#就是ceiling函数,x就是重量变量! 展开
条件:a表的客户,客户性质,商品名称=b表的客户,客户性质,商品名称 并且a表的重量要符合b表的重量段,即a表的重量>=最低重量 and 重量<=最高重量
满足条件的结果把表达式的值更新到金额,比如上面的订单号1取的公式是 #(x/0.5)*1.5
其中b表中的公式#代表ceiling函数,x是重量变量,比如上面的30.88计算结果就是93
在过程中如何声明#就是ceiling函数,x就是重量变量! 展开
2个回答
展开全部
可以用INSTEAD OF 触发器来解决:
请看:
图书馆数据库基本脚本与INSTEAD OF 触发器的本质
第一部分、图书馆数据库基本脚本
借书证记录表
CREATE TABLE [dbo].[借书证记录表](
[ID] [int] IDENTITY(1,1) NOT NULL,
[读者姓名] [nvarchar](10) COLLATE Chinese_PRC_CI_AS NULL,
[借书证编号] [nvarchar](10) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_借书证记录表] PRIMARY KEY CLUSTERED
([ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[借书记录表](
[ID] [int] IDENTITY(1,1) NOT NULL,
[借书证编号] [nvarchar](10) COLLATE Chinese_PRC_CI_AS NULL,
[书名] [nvarchar](10) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_借书记录表] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
一、1、防超借触发器(如:定额为5本):
CREATE trigger [借书记录表触发器] on [dbo].[借书记录表]
INSTEAD OF INSERT
as
begin
if not exists(select 1 from inserted a inner join 借书记录表 b on a.借书证编号=b.借书证编号 group by a.借书证编号 having count(*)>=5)
insert into 借书记录表 select * from inserted
else
select '已满五本!'
end
注意:“select 1……”中的“1”,是指1行数据,数据行的数量。
“inner join”,指表关联的意思。
“having”,表示有,存在。
一、2、防超借触发器(如:定额为5本):
CREATE trigger [借书记录表触发器] on [dbo].[借书记录表]
INSTEAD OF INSERT
as
begin
--在本表中查找,判断是否还能借
if not exists(select 1 from inserted a inner join 借书记录表 b on a.借书证编号=b.借书证编号 group by a.借书证编号 having count(*)>=5)
insert 借书记录表 (借书证编号, 书名)
select 借书证编号, 书名 from inserted
--提示
else
select '已满五本!'
end
注意:“select 1……”中的“1”,是指没有列名的数值为1的列,其实是表的虚拟列。
如语句:select 1 AS 虚拟列,则表中的这一列名为“虚拟列”的数值为1。
“inner join”,指表关联的意思。
“having”,表示有,存在。
一、3、未能防超借的触发器(如:定额为5本):
--防超借触发器:
CREATE trigger [借书记录表触发器] on [dbo].[借书记录表]
INSTEAD OF INSERT
as
begin
--在本表中查找,判断是否还能借
if not exists(select 1 from inserted a inner join 借书记录表b on a.借书证编号=b.借书证编号group by a.借书证编号having count(*)>=5)
insert 借书记录表(借书证编号, 书名)
select 借书证编号, 书名from inserted
--提示
else
insert 借书记录表(借书证编号, 书名)
select 借书证编号, 书名from inserted
select '已满五本!'
end
二、--防删除触发器,尚有借书的读者不可被删除(如:尚有借书,不能删除)
CREATE trigger [借书证记录表触发器]on [dbo].[借书证记录表]
INSTEAD OF delete
as
begin
if not exists(select 1 from 借书记录表 a inner join deleted b on a.借书证编号=b.借书证编号)
delete from 借书证记录表 where ID in(select ID from deleted)
else
select '尚有借书,不能删除!'
end
请看:
图书馆数据库基本脚本与INSTEAD OF 触发器的本质
第一部分、图书馆数据库基本脚本
借书证记录表
CREATE TABLE [dbo].[借书证记录表](
[ID] [int] IDENTITY(1,1) NOT NULL,
[读者姓名] [nvarchar](10) COLLATE Chinese_PRC_CI_AS NULL,
[借书证编号] [nvarchar](10) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_借书证记录表] PRIMARY KEY CLUSTERED
([ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[借书记录表](
[ID] [int] IDENTITY(1,1) NOT NULL,
[借书证编号] [nvarchar](10) COLLATE Chinese_PRC_CI_AS NULL,
[书名] [nvarchar](10) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_借书记录表] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
一、1、防超借触发器(如:定额为5本):
CREATE trigger [借书记录表触发器] on [dbo].[借书记录表]
INSTEAD OF INSERT
as
begin
if not exists(select 1 from inserted a inner join 借书记录表 b on a.借书证编号=b.借书证编号 group by a.借书证编号 having count(*)>=5)
insert into 借书记录表 select * from inserted
else
select '已满五本!'
end
注意:“select 1……”中的“1”,是指1行数据,数据行的数量。
“inner join”,指表关联的意思。
“having”,表示有,存在。
一、2、防超借触发器(如:定额为5本):
CREATE trigger [借书记录表触发器] on [dbo].[借书记录表]
INSTEAD OF INSERT
as
begin
--在本表中查找,判断是否还能借
if not exists(select 1 from inserted a inner join 借书记录表 b on a.借书证编号=b.借书证编号 group by a.借书证编号 having count(*)>=5)
insert 借书记录表 (借书证编号, 书名)
select 借书证编号, 书名 from inserted
--提示
else
select '已满五本!'
end
注意:“select 1……”中的“1”,是指没有列名的数值为1的列,其实是表的虚拟列。
如语句:select 1 AS 虚拟列,则表中的这一列名为“虚拟列”的数值为1。
“inner join”,指表关联的意思。
“having”,表示有,存在。
一、3、未能防超借的触发器(如:定额为5本):
--防超借触发器:
CREATE trigger [借书记录表触发器] on [dbo].[借书记录表]
INSTEAD OF INSERT
as
begin
--在本表中查找,判断是否还能借
if not exists(select 1 from inserted a inner join 借书记录表b on a.借书证编号=b.借书证编号group by a.借书证编号having count(*)>=5)
insert 借书记录表(借书证编号, 书名)
select 借书证编号, 书名from inserted
--提示
else
insert 借书记录表(借书证编号, 书名)
select 借书证编号, 书名from inserted
select '已满五本!'
end
二、--防删除触发器,尚有借书的读者不可被删除(如:尚有借书,不能删除)
CREATE trigger [借书证记录表触发器]on [dbo].[借书证记录表]
INSTEAD OF delete
as
begin
if not exists(select 1 from 借书记录表 a inner join deleted b on a.借书证编号=b.借书证编号)
delete from 借书证记录表 where ID in(select ID from deleted)
else
select '尚有借书,不能删除!'
end
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询