テーブル変数とそのように宣言されたテーブルに基づいて、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
)
- テーブル変数のデータの各行
@tmp
Table1
でUserID/SgsID
組み合わせが一致する行を削除UserID/SgsID
するTable1
- から削除された組み合わせを削除
UserID/SgsID
する@tmp
Table1
OUTPUT INTO
やを使用するなど、さまざまなアプローチを研究してきましたが、INTERSECT
2 つのテーブルにまたがって削除するクエリを作成することはできません (実際、可能だとは思いません)。
次のコードを使用して上記の手順を実行しましたが、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