0

我希望删除一个 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
4

2 回答 2

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
于 2013-02-28T10:17:54.867 回答
1

由于您要删除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真的需要子查询中的所有这些....您可能需要根据您的要求进行调整。

于 2013-02-28T10:18:30.020 回答