0

我是 SQL 的新手,因为我通常可以在不深入研究的情况下完成简单的查询/迁移,但是我有一个不涉及连接的更复杂的查询/迁移,我想知道当没有外部约束时如何删除在级联上使用。这是我的查询。我无法从谷歌搜索中找到一个好的答案。

WITH aDeleteVariable AS (SELECT TOP 1 FooID as id FROM [BSystem].[Foo].[bar] order by      
CreateTimeUTC desc)
DELETE FROM [BSystem].[Foo].[fooBar] where FooID = id
DELETE FROM [BSystem].[Foo].[bar] where FooID = id

所以我需要先删除 [BSystem].[Foo].fooBar,然后是 [BSystem].[Foo].[bar] 这将在运行时执行,因此不能硬编码。“1”真的会是n,但是我已经解决了那个代码。

尝试执行此查询时,我得到无效的列名“id” 。我该如何解决?

4

1 回答 1

1

您的DELETE陈述不引用aDeleteVariable. 该id列仅存在于 的上下文中aDeleteVariable

你需要加入aDeleteVariable你的DELETE陈述。此外,您不能重用公用表表达式,因此您必须复制它。

请参阅此SQL Fiddle(带有简化的架构/表名称),但以下是您想要的。

WITH aDeleteVariable AS (SELECT TOP 1 FooID as id
        FROM [BSystem].[Foo].[bar] order by CreateTimeUTC desc)
DELETE FB 
        FROM [BSystem].[Foo].[fooBar] AS FB
        INNER JOIN aDeleteVariable AS DV ON (FB.FooID = DV.id);
WITH aDeleteVariable AS (SELECT TOP 1 FooID as id
        FROM [BSystem].[Foo].[bar] order by CreateTimeUTC desc)
DELETE B
        FROM [BSystem].[Foo].[bar] AS B
        INNER JOIN aDeleteVariable AS DV ON (B.FooID = DV.id);

当然,加入 to 后aDeleteVariable,您不需要id别名。以下将起作用。

WITH aDeleteVariable AS (SELECT TOP 1 FooID
        FROM [BSystem].[Foo].[bar] order by CreateTimeUTC desc)
DELETE FB 
        FROM [BSystem].[Foo].[fooBar] AS FB
        INNER JOIN aDeleteVariable AS DV ON (FB.FooID = DV.FooID);
WITH aDeleteVariable AS (SELECT TOP 1 FooID
        FROM [BSystem].[Foo].[bar] order by CreateTimeUTC desc)
DELETE B
        FROM [BSystem].[Foo].[bar] AS B
        INNER JOIN aDeleteVariable AS DV ON (B.FooID = DV.FooID);

鉴于有两个单独的公用表表达式,存在竞争条件,并且第二个表达式可能返回不同的FooID(或者当您将其适应N记录时返回多个)。您可能希望将 ID 选择到表变量中,而不是使用公用表表达式。以下应该工作。

DECLARE @DeleteVariable TABLE (FooID INT);
INSERT INTO @DeleteVariable (FooID)
        SELECT TOP 1 FooID FROM [BSystem].[Foo].[bar]
                ORDER BY CreateTimeUTC DESC;
DELETE FB 
        FROM [BSystem].[Foo].[fooBar] AS FB
        INNER JOIN @DeleteVariable AS DV ON (FB.FooID = DV.FooID);
DELETE B
        FROM [BSystem].[Foo].[bar] AS B
        INNER JOIN @DeleteVariable AS DV ON (B.FooID = DV.FooID);
于 2013-02-20T00:01:10.750 回答