SQL 服务器 - 管理相同的行 table
SQL Server - manage rows in same table
如何创建具有相同值的新数据集table?
下面的脚本显示了我必须在生产环境中工作的示例情况:
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
像这样检索数据:
我必须得到这个结果:
我想知道一些人在 SQL Server 2012 中使用层次结构函数来对相同 table 的行进行分组。
提前致谢
由于 table 中只有 42 行数据,因此您可以使用递归 CTE 在两个方向上检查 table 中每一行的路径。并跟踪路径中找到的最小 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
如何创建具有相同值的新数据集table?
下面的脚本显示了我必须在生产环境中工作的示例情况:
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
像这样检索数据:
我必须得到这个结果:
我想知道一些人在 SQL Server 2012 中使用层次结构函数来对相同 table 的行进行分组。
提前致谢
由于 table 中只有 42 行数据,因此您可以使用递归 CTE 在两个方向上检查 table 中每一行的路径。并跟踪路径中找到的最小 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