【问题标题】:SQL Server stored procedure delete statementSQL Server 存储过程删除语句
【发布时间】:2013-02-28 10:09:47
【问题描述】:

我希望删除一个 select 语句返回的结果,我这样做的原因是因为我在表之间存在关系,如果我从最顶层的表中删除它在其他表中的子行也必须被删除。

谁能帮我纠正这个存储过程?

ALTER proc [dbo].[storedprocname] 
    (@Parameter uniqueidentifier = '00000000-0000-0000-0000-000000000000')
AS BEGIN
    DELETE FROM TableOne 
    WHERE IDOne IN
        (SELECT
           IDOne,
           DescOne, IndexOne,
           IDTwo,
           QuestionTwo, ControlTypeTwo, IndexTwo,
           IDThree,
           DescThree, IndexThree,
           QuestionFour,
           OptionFour
    FROM
           TableOne
        INNER JOIN 
           TableTwo ON TableTwo.CatID = TableOne.IDOne
        INNER JOIN 
           TableThree ON TableThree.Question = TableTwo.IDTwo
        LEFT OUTER JOIN
           TableFour ON TableFour.Question = TableThree.IDThree
        WHERE
           TableOne.IDOne = @Parameter)
END

【问题讨论】:

    标签: sql-server select stored-procedures join


    【解决方案1】:
    ALTER proc [dbo].[storedprocname] 
      (@Parameter uniqueidentifier = '00000000-0000-0000-0000-000000000000')
    AS BEGIN
      DELETE FROM TableOne 
        WHERE IDOne IN
          (SELECT
             IDOne
           FROM
             TableOne
           INNER JOIN 
             TableTwo ON TableTwo.CatID = TableOne.IDOne
           INNER JOIN 
             TableThree ON TableThree.Question = TableTwo.IDTwo
           LEFT OUTER JOIN
             TableFour ON TableFour.Question = TableThree.IDThree
           WHERE
             TableOne.IDOne = @Parameter)
    END
    

    【讨论】:

      【解决方案2】:

      由于您要删除IDOne 在可能值列表中的所有行 - 那么您需要确保IN (...) 之后的子查询也返回单列,这可以是用来比较!毕竟,您无法将单个 IDOne 值与您当前返回的整个列列表进行比较......

      试试这样的:

      ALTER proc [dbo].[storedprocname] 
          (@Parameter uniqueidentifier = '00000000-0000-0000-0000-000000000000')
      AS BEGIN
          DELETE FROM TableOne 
          WHERE IDOne IN
              (SELECT
                 IDOne
               FROM
                 TableOne
              INNER JOIN 
                 TableTwo ON TableTwo.CatID = TableOne.IDOne
              INNER JOIN 
                 TableThree ON TableThree.Question = TableTwo.IDTwo
              LEFT OUTER JOIN
                 TableFour ON TableFour.Question = TableThree.IDThree
              WHERE
                 TableOne.IDOne = @Parameter)
      END
      

      我不知道(你的问题太模糊,不够清楚)子查询中的所有JOIN 是否真的需要......你可能需要根据你的要求进行调整。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-24
        相关资源
        最近更新 更多