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ステートメントは参照していませんaDeleteVariableid列は、のコンテキストでのみ存在しますaDeleteVariable

aDeleteVariableあなたはあなたのDELETE声明に参加する必要があります。また、共通テーブル式は再利用できないため、複製する必要があります。

このSQLフィドル(簡略化されたスキーマ/テーブル名付き)を参照してください。ただし、以下が必要です。

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);

もちろん、に参加すると、エイリアス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);

2つの別個の共通テーブル式がある場合、競合状態があり、2番目の式は異なる(またはこれをレコード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 に答える