递归触发器和错误:子查询返回的值超过1

时间:2015-04-19 13:06:13

标签: sql-server recursion triggers nested

我需要你的帮助!

我正在使用sql server 1--我创建了这个触发器,但似乎是错误的......

CREATE TRIGGER [dbo].[chargeAZero] 
ON [dbo].[situations_final] 
after INSERT 
AS 
  BEGIN 
      SET nocount ON 

      UPDATE sfinal 
      SET    charge = 00 
      FROM   inserted i 
             INNER JOIN situations_final sfinal 
                     ON i.referencepiece = sfinal.referencepiece 
                        AND i.ancienposte = sfinal.ancienposte 
                        AND i.numerophase = sfinal.numerophase 
                        AND i.datestrategie = sfinal.datestrategie 
      /*and i.Datecadence=sfinal.Datecadence*/ 
      WHERE  (SELECT sfinal.nouveauposte 
              FROM   situations_final sfinal 
                     INNER JOIN inserted i 
                             ON i.referencepiece = sfinal.referencepiece 
                                AND i.ancienposte = sfinal.ancienposte 
                                AND i.numerophase = sfinal.numerophase 
                                AND i.datestrategie = sfinal.datestrategie) IS 
             NULL 
  END 

错误消息总是一样的:子查询返回了多个值...我认为我正确地编写了我的触发器,就像其他工作正常一样。

2--我的第二个问题是:是否有可能只递归一个触发器?

3--正如你在我的数据库中注意到的“Nomenclatures”(英文的材料清单)我有3个要素: * codepiecemere:组件母亲 * codepiecefille:组件子 * 数量。 我举一个例子说明我需要的东西: 母亲=孩子= B数量= 2 母亲= B孩子= C数量= 3

我想要一个触发器给我一个这样的结果: A 1 B 2 C 6 = 2 * 3(产生1B的C所需的量)。

非常感谢

4 个答案:

答案 0 :(得分:1)

is null通常不与子查询一起使用。试试这个:

        where  not exists (select 1
                           from SITUATIONS_Final sfinal inner join inserted i
                                on i.ReferencePiece=sfinal.ReferencePiece
                                   and i.AncienPoste=sfinal.AncienPoste
                                   and i.numerophase=sfinal.numerophase
                                   and i.datestrategie=sfinal.datestrategie
                          )

这假设is null正在测试没有返回值,而NULL中的sfinal.nouveauposte值正在测试。如果是后者:

        where exists (select 1
                      from SITUATIONS_Final sfinal inner join inserted i
                           on i.ReferencePiece=sfinal.ReferencePiece
                              and i.AncienPoste=sfinal.AncienPoste
                              and i.numerophase=sfinal.numerophase
                              and i.datestrategie=sfinal.datestrategie
                      where sfinal.nouveauposte is null
                     )

编辑:

你需要子查询吗?

  UPDATE sfinal 
  SET    charge = 00 
  FROM   inserted i 
         INNER JOIN situations_final sfinal 
                 ON i.referencepiece = sfinal.referencepiece 
                    AND i.ancienposte = sfinal.ancienposte 
                    AND i.numerophase = sfinal.numerophase 
                    AND i.datestrategie = sfinal.datestrategie 
  WHERE sfinal.nouveauposte IS NULL;

答案 1 :(得分:1)

这是一个解决材料聚合问题的递归查询。

表格定义

CREATE TABLE [dbo].[Material](
  [Mother] [varchar](100) NOT NULL,
  [Child] [varchar](100) NOT NULL,
  [Quantity] [int] NOT NULL,
)

和查询:

WITH Result(mother, child, quantity)
AS
(
    select * from material 
    union all
    select M.mother, R.Child,  M.quantity * R.Quantity as Quantity
    from Result R INNER JOIN Material M ON M.Child = R.Mother 
 )
 select * from result

您可以在此处查看示例:http://sqlfiddle.com/#!6/6dc64/1

<强>更新

Sql小提琴不起作用,我不知道为什么

更新2

Sql Fiddle回来了! : - )

答案 2 :(得分:0)

我认为问题是您在一个命令中插入了多行,因此插入的表包含多行。因此,子查询

SELECT sfinal.nouveauposte 
          FROM   situations_final sfinal 
                 INNER JOIN inserted i 
                         ON i.referencepiece = sfinal.referencepiece 
                            AND i.ancienposte = sfinal.ancienposte 
                            AND i.numerophase = sfinal.numerophase 
                            AND i.datestrategie = sfinal.datestrategie

也包含多个行,无法与标量值的NULL进行比较。

答案 3 :(得分:0)

我雄心勃勃:D我试图改进剧本:

WITH RESULT (MOTHER, CHILD, QUANTITY)
        as
        (
            select Mother, Child, CONVERT(Numeric(10,0), Quantity) as Quantity from bilangammestest 
            union all select M.mother, R.Child, CONVERT(Numeric(10,0), M.quantity * R.Quantity) as Quantity from Result R 
            INNER JOIN bilangammestest M ON M.Child = R.Mother

            )
            select * from result
            where mother not in (select child from bilangammestest )

以下是我在桌子上的数据&#34; Bilangammestest&#34;:

Z A 1

Z Y 1

A B 2

Y B 2

B C 3

以下是我得到的结果:

Z A 1

Z Y 1

Z C 6

Z C 6

Z B 2

Z B 2

这是我想要的最终结果:

Z A 1

Z Y 1

Z C 12

Z B 4

我试着做一笔&#39;总结&#39;但我无法正确地做到:(