我认为没有光标就无法完成此操作。
我在示例数据中添加了更多行,以测试它在其他情况下的工作方式。
逻辑很简单。首先获取所有不同值的列表Num_ID
。然后循环遍历它们,并在每次迭代时向目标表添加一行。确定Alpha_ID
我将使用的添加值EXCEPT
获取所有可用的运算符Alpha_ID
当前值Num_ID
从源表中删除之前使用过的所有值。
可以这样写INSERT
不使用显式变量@CurrAlphaID
,但是使用变量看起来更干净一些。
Here is SQL小提琴 http://sqlfiddle.com/#!3/96e69c/2/0.
DECLARE @TSrc TABLE (Num_ID varchar(10), Alpha_ID varchar(10));
INSERT INTO @TSrc (Num_ID, Alpha_ID) VALUES
('1', 'A'),
('1', 'B'),
('1', 'C'),
('2', 'B'),
('2', 'C'),
('3', 'A'),
('3', 'C'),
('4', 'A'),
('4', 'C'),
('5', 'A'),
('5', 'B'),
('5', 'C'),
('6', 'D'),
('6', 'E');
DECLARE @TDst TABLE (Num_ID varchar(10), Alpha_ID varchar(10));
DECLARE @CurrNumID varchar(10);
DECLARE @CurrAlphaID varchar(10);
DECLARE @iFS int;
DECLARE @VarCursor CURSOR;
SET @VarCursor = CURSOR FAST_FORWARD
FOR
SELECT DISTINCT Num_ID
FROM @TSrc
ORDER BY Num_ID;
OPEN @VarCursor;
FETCH NEXT FROM @VarCursor INTO @CurrNumID;
SET @iFS = @@FETCH_STATUS;
WHILE @iFS = 0
BEGIN
SET @CurrAlphaID =
(
SELECT TOP(1) Diff.Alpha_ID
FROM
(
SELECT Src.Alpha_ID
FROM @TSrc AS Src
WHERE Src.Num_ID = @CurrNumID
EXCEPT
SELECT Dst.Alpha_ID
FROM @TDst AS Dst
) AS Diff
ORDER BY Diff.Alpha_ID
);
INSERT INTO @TDst (Num_ID, Alpha_ID)
VALUES (@CurrNumID, @CurrAlphaID);
FETCH NEXT FROM @VarCursor INTO @CurrNumID;
SET @iFS = @@FETCH_STATUS;
END;
CLOSE @VarCursor;
DEALLOCATE @VarCursor;
SELECT * FROM @TDst;
Result
Num_ID Alpha_ID
1 A
2 B
3 C
4 NULL
5 NULL
6 D
有索引(Num_ID, Alpha_ID)
在源表上会有所帮助。有索引(Alpha_ID)
在目标表上也会有帮助。