Sql 如何删除主表中与临时表中的ID匹配的行?

Sql 如何删除主表中与临时表中的ID匹配的行?,sql,.net,sql-server,tsql,Sql,.net,Sql Server,Tsql,下面是我的SQL代码。在delete部分,我在WITH语句中声明的对象tblDeletes给了我无效的对象名,有什么问题吗?多谢各位 USE [NEDB_beta] GO /****** Object: StoredProcedure [dbo].[cms_cpAdminDeleteContentItemById] Script Date: 12/13/2014 12:11:11 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER

下面是我的SQL代码。在delete部分,我在WITH语句中声明的对象tblDeletes给了我无效的对象名,有什么问题吗?多谢各位

    USE [NEDB_beta]
GO
/****** Object:  StoredProcedure [dbo].[cms_cpAdminDeleteContentItemById]    Script Date: 12/13/2014 12:11:11 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[cms_cpAdminDeleteContentItemById] 
@ID int
AS
BEGIN
WITH    tblDeletes AS 
        (
        SELECT  *
        FROM    [NEDB_beta].[dbo].[cms_tblContent]
        WHERE   ID = @ID -- this condition defines the ultimate ancestors in your chain, change it as appropriate
        UNION ALL
        SELECT  c.*
        FROM    [NEDB_beta].[dbo].[cms_tblContent] as c
        JOIN    tblDeletes
        ON      c.intParentIdDraft = tblDeletes.ID
        )
SELECT  *
FROM    tblDeletes

DELETE FROM [NEDB_beta].[dbo].[cms_tblContent] 
WHERE ID IN 
    (SELECT ID 
     FROM tblDeletes);

END

您可以在公共表表达式后面的语句中使用它。您已经使用它从中进行选择。之后它就不存在了。

因为您使用的是CTE,而CTE只为一个查询定义。但在这里,您使用的是相同的CTE。CTE范围只能用于一条语句,不能使用两次

删除select语句,在CTE创建之后,我认为这不是必需的,因为您的主要动机是删除记录

但如果您想使用SELECT语句,则可以重复CTE创建步骤,或者使用Temp table代替CTE

ALTER PROCEDURE [dbo].[cms_cpAdminDeleteContentItemById] 
@ID int
AS
BEGIN
WITH    tblDeletes AS 
        (
        SELECT  *
        FROM    [NEDB_beta].[dbo].[cms_tblContent]
        WHERE   ID = @ID -- this condition defines the ultimate ancestors in your chain, change it as appropriate
        UNION ALL
        SELECT  c.*
        FROM    [NEDB_beta].[dbo].[cms_tblContent] as c
        JOIN    tblDeletes
        ON      c.intParentIdDraft = tblDeletes.ID
        )

DELETE FROM [NEDB_beta].[dbo].[cms_tblContent] 
WHERE ID IN 
    (SELECT ID 
     FROM tblDeletes);

END

我不确定这个问题是否有意义。但您正在tbldeletes定义中引用tbldeletes。我也没有看到您从子ID中选择父ID。此外,您可能根本不需要使用。但我认为问题的根源在于,您在定义中引用了TBLDelete,因为您使用的是CTE,而CTE只为一个查询定义。但在这里,您使用的是相同的CTE。CTE scope只能用于一条语句,您不能使用它两次。@tlbignerd这就是您编写递归CTE的方式。哈,谢谢@Martin Smith,我以前从未见过这种情况。如果他们需要Select,他们还可以将输出删除*