SQL Server-管理同一表中的行
如何创建具有相同表的相同值的新数据集 下面的脚本显示了我必须在生产环境中工作的示例情况:SQL Server-管理同一表中的行,sql,sql-server,special-characters,Sql,Sql Server,Special Characters,如何创建具有相同表的相同值的新数据集 下面的脚本显示了我必须在生产环境中工作的示例情况: IF EXISTS (SELECT 1 FROM DevTest.SYS.OBJECTS WHERE NAME = 'DevTable') DROP TABLE DevTable ; CREATE TABLE DevTable ( Field1 VARCHAR(10), Field2 VARCHAR(10) ); INSERT INTO DevTable S
IF EXISTS (SELECT 1 FROM DevTest.SYS.OBJECTS WHERE NAME = 'DevTable')
DROP TABLE DevTable ;
CREATE TABLE DevTable
(
Field1 VARCHAR(10),
Field2 VARCHAR(10)
);
INSERT INTO DevTable
SELECT 'Martin' , 'Jackson'
UNION ALL
SELECT 'Theresa' , 'Allison'
UNION ALL
SELECT 'Jackson' , 'Brad'
UNION ALL
SELECT 'Beatriz' , 'Lewis'
UNION ALL
SELECT 'Jose' , 'Mary'
UNION ALL
SELECT 'Mary' , 'Allan'
UNION ALL
SELECT 'Brad' , 'Joaquim'
UNION ALL
SELECT 'Joaquim' , 'Lia'
END
检索如下所示的数据:
我必须得到这个结果:
我想知道一些在SQLServer2012中使用层次结构函数对同一表的行进行分组的方法
由于表中只有42行数据,因此可以使用递归CTE在两个方向上签出表中每行的路径。并跟踪路径中找到的最小Field1/Field2组合 然后使用它将行分组在一起,如下所示。这假设数据中没有周期。如果有,您将收到由于无限递归而导致的错误
WITH R1
AS (SELECT *,
CONCAT(Field1, '~', Field2) AS Grp
FROM DevTable
UNION ALL
SELECT D.*,
CASE
WHEN CONCAT(D.Field1, '~', D.Field2) < Grp THEN CONCAT(D.Field1, '~', D.Field2)
ELSE Grp
END
FROM DevTable D
JOIN R1
ON R1.Field2 = D.Field1),
R2
AS (SELECT *,
CONCAT(Field1, '~', Field2) AS Grp
FROM DevTable
UNION ALL
SELECT D.*,
CASE
WHEN CONCAT(D.Field1, '~', D.Field2) < Grp THEN CONCAT(D.Field1, '~', D.Field2)
ELSE Grp
END
FROM DevTable D
JOIN R2
ON D.Field2 = R2.Field1),
R
AS (SELECT *
FROM R1
UNION ALL
SELECT *
FROM R2),
T
AS (SELECT *,
ROW_NUMBER()
OVER (
PARTITION BY Field1, Field2
ORDER BY Grp) AS RN
FROM R)
SELECT Field1,
Field2,
DENSE_RANK()
OVER (
ORDER BY Grp)
FROM T
WHERE RN = 1
生产表的大小是多少?@MartinSmith仅42行,组编号是任意的吗?只要这些行按上述相同的组进行分组?@MartinSmith是的。这只是一个例子,但目标是寻找平等的价值观在字段1和字段2中,通过生成ID将它们合并。为什么Joaquim Lia与Brad Joaquim不在同一组中?哇,谢谢@MartinSmith。我花了一些时间检查产品环境,但您的脚本确实很有帮助。再次感谢@马丁史密斯做完了!