Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-管理同一表中的行_Sql_Sql Server_Special Characters - Fatal编程技术网

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。我花了一些时间检查产品环境,但您的脚本确实很有帮助。再次感谢@马丁史密斯做完了!