帖,折磨人的触发器
求助帖,折磨人的触发器!
两个表,其中table1 中的A列为主键,在table2中C+D列为主键,C列与A列关联。
一个触发器,需要实现功能:新增table2时,当E字段在(-1,3)区间范围内时,判断为Y,否则为N。并且在C列值相同的情况下,不管有多少笔序号(即多笔数据),只要其中有一个判断为N,and table1.A=table2.C,那么返回N到table1的B列对应字段中,否则返回Y。
table1
A(KEY) B
10 Y
20 Y
30 N
table2
C D(序号) E 判断
10 01 -1 Y
10 02 0 Y
20 01 3 Y
20 02 2 Y
20 03 5 N
30 01 2 Y
30 02 4 N
我写的触发器如下:
ALTER trigger [dbo].[T] ON [dbo].[table2] FOR INSERT
AS
SET NOCOUNT ON;
BEGIN
UPDATE table1 SET table1.B=( CASE WHEN (table2.E>=-1 AND table2.E<=3)THEN 'Y' ELSE 'N' END )
FROM table1 AS T1,table2 AS T2 WHERE T1.A=T2.C
END
但是如果这样的话,因为table2中会有多个判断值,所以每次进行新增时,会提示子查询的返回值不止一个。求解,如何实现只返回一个值呢。
------解决思路----------------------
两个表,其中table1 中的A列为主键,在table2中C+D列为主键,C列与A列关联。
一个触发器,需要实现功能:新增table2时,当E字段在(-1,3)区间范围内时,判断为Y,否则为N。并且在C列值相同的情况下,不管有多少笔序号(即多笔数据),只要其中有一个判断为N,and table1.A=table2.C,那么返回N到table1的B列对应字段中,否则返回Y。
table1
A(KEY) B
10 Y
20 Y
30 N
table2
C D(序号) E 判断
10 01 -1 Y
10 02 0 Y
20 01 3 Y
20 02 2 Y
20 03 5 N
30 01 2 Y
30 02 4 N
我写的触发器如下:
ALTER trigger [dbo].[T] ON [dbo].[table2] FOR INSERT
AS
SET NOCOUNT ON;
BEGIN
UPDATE table1 SET table1.B=( CASE WHEN (table2.E>=-1 AND table2.E<=3)THEN 'Y' ELSE 'N' END )
FROM table1 AS T1,table2 AS T2 WHERE T1.A=T2.C
END
但是如果这样的话,因为table2中会有多个判断值,所以每次进行新增时,会提示子查询的返回值不止一个。求解,如何实现只返回一个值呢。
------解决思路----------------------
CREATE TRIGGER TRG_table2_INSERT应该先聚合一下
ON table2
FOR INSERT
AS
BEGIN
SET NOCOUNT ON
UPDATE T1
SET B=T2.B
FROM table1 T1 JOIN
(SELECT C,CASE WHEN MIN(E)<-1 OR MAX(E)>3 THEN 'N'ELSE'Y'END B
FROM table2
GROUP BY C)T2 ON T1.A=T2.C
SET NOCOUNT OFF
END