2013-02-28 201 views
0

我希望删除结果select语句返回,原因我这样做是因为我有表之间的关系,如果我从最顶级的表中删除其子表中的子行也被删除。SQL Server存储过程删除语句

任何人都可以为我纠正这个存储过程吗?

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 

回答

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 
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在子查询中....你可能需要根据你的需求调整它。