我有值SQL Server 2008的更新表和开关值查询优化
ID Son Father
----------- ---------- ----------
1 Mark Gerard
2 Gerard Ivan
3 Leo Samuel
4 Samuel Johan
5 Ivan Carles
我需要改变的表像这样的表:
ID Son Father
----------- ---------- ----------
1 Mark Carles
2 Gerard Carles
3 Leo Johan
4 Samuel Johan
5 Ivan Carles
的目标是找到一个主要'Father'
和用此值更新所有'Son'
记录。主要'Father'
可以不同。
我的代码是未来:
DECLARE @CNT INT
DECLARE @CH_1 NVARCHAR(10)
DECLARE @CH_2 NVARCHAR(10)
CREATE TABLE #PPL (ID INT, Son NVARCHAR(10), Father NVARCHAR(10))
INSERT INTO #PPL VALUES (1, 'Mark', 'Gerard')
INSERT INTO #PPL VALUES (2, 'Gerard', 'Ivan')
INSERT INTO #PPL VALUES (3, 'Leo', 'Samuel')
INSERT INTO #PPL VALUES (4, 'Samuel', 'Johan')
INSERT INTO #PPL VALUES (5, 'Ivan', 'Carles')
SET @I = 1
SET @CNT = (SELECT COUNT(ID) FROM #PPL)
WHILE @I <= @CNT
BEGIN
SET @J = 1
WHILE @J <= @CNT
BEGIN
SET @CH_1 = (SELECT Son FROM #PPL WHERE ID = @J)
SET @CH_2 = (SELECT Father FROM #PPL WHERE ID = @J)
UPDATE #PPL SET Father = @CH_2 WHERE Father = @CH_1
SET @J = @J + 1
END;
SET @I = @I + 1
END;
SELECT * FROM #PPL
DROP TABLE #PPL
此代码工作正确的,但对于低数量的记录。这个代码如何优化?
谢谢!
请勿使用LOOP。改用递归CTE。 – xQbert
作为一个例子:http://stackoverflow.com/questions/14274942/sql-server-cte-and-recursion-example – xQbert
@xQbert:你怎么定义这里的根节点 – TheGameiswar