5

テーブル変数とそのように宣言されたテーブルに基づいて、SQL Server 2012 プロシージャで次の疑似ロジックを実行する必要があります。

DECLARE @tmp TABLE
    (
    ID int IDENTITY(1,1),
    UserID int NOT NULL,
    SgsID int NOT NULL
    )

CREATE TABLE #Table1
    (
    ID int IDENTITY(1,1),
    UserID int NOT NULL,
    SgsID int NOT NULL
    )
  1. テーブル変数のデータの各行@tmp
  2. Table1UserID/SgsID組み合わせが一致する行を削除UserID/SgsIDするTable1
  3. から削除された組み合わせを削除UserID/SgsIDする@tmpTable1

OUTPUT INTOやを使用するなど、さまざまなアプローチを研究してきましたが、INTERSECT2 つのテーブルにまたがって削除するクエリを作成することはできません (実際、可能だとは思いません)。

次のコードを使用して上記の手順を実行しましたが、T-SQL の専門家がより簡潔で効率的なアプローチを提案できるかどうか疑問に思っていました。

オンライン バージョンについては、SQLFiddle を参照してください。

CREATE TABLE #Table1
    (
    ID int IDENTITY(1,1),
    UserID int NOT NULL,
    SgsID int NOT NULL
    )

INSERT INTO #Table1 (UserID, SgsID) VALUES (5, 99)
INSERT INTO #Table1 (UserID, SgsID) VALUES (10, 89)
INSERT INTO #Table1 (UserID, SgsID) VALUES (150, 79)
INSERT INTO #Table1 (UserID, SgsID) VALUES (200, 69)
INSERT INTO #Table1 (UserID, SgsID) VALUES (250, 59)
SELECT * FROM #Table1 

DECLARE @tmp TABLE
    (
    ID int IDENTITY(1,1),
    UserID int NOT NULL,
    SgsID int NOT NULL
    )

INSERT INTO @tmp (UserID, SgsID) VALUES (150, 79)
INSERT INTO @tmp (UserID, SgsID) VALUES (200, 69)
INSERT INTO @tmp (UserID, SgsID) VALUES (250, 59)
INSERT INTO @tmp (UserID, SgsID) VALUES (999, 49)
SELECT * FROM @tmp

DECLARE @tbl_commonRows TABLE (UserID int, SgsID int)
INSERT INTO @tbl_commonRows 
    (
    UserID,
    SgsID
    ) 
SELECT 
    UserID,
    SgsID 
FROM
    #Table1
INTERSECT 
SELECT
    UserID,
    SgsID
FROM
    @tmp 

DELETE FROM 
    #Table1 
WHERE 
    (ID IN (
        SELECT 
            ID 
        FROM 
            #Table1 t1 INNER JOIN
            @tbl_commonRows c ON c.UserID = t1.UserID AND c.SgsID = t1.SgsID))

DELETE FROM
    @tmp
WHERE
    (ID IN (
        SELECT
            ID
        FROM
            @tmp t2 INNER JOIN
            @tbl_commonrows c ON c.UserID = t2.UserID AND c.SgsID = t2.SgsID))

SELECT * FROM #Table1 
SELECT * FROM @tmp
DROP TABLE #Table1
4

3 に答える 3

2

OUTPUT コマンドは、削除のために INSERTED および DELETED 列よりも多くの列を使用できるという事実を利用できます (悲しいことに、挿入はできません)。

    DECLARE @output TABLE (id int) 

    DELETE FROM tbl
    OUTPUT tmp.ID INTO @output(id)
    FROM #Table1 tbl
    JOIN @tmp tmp 
        ON tbl.UserID = tmp.UserID 
        AND tbl.SgsID = tmp.SgsID

    DELETE FROM tmp
    FROM @tmp tmp
    JOIN @Output outp ON tmp.id = outp.id   
于 2013-03-06T20:11:49.083 に答える
1

これにMERGEを使用することを検討しましたか? 別のオプションかもしれません。構文は素晴らしく、従うのは簡単です。

マージ (Transact-SQL)

于 2013-03-06T14:37:33.040 に答える