Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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/4/webpack/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 如何自联接重复行以显示为一行?_Sql_Oracle_Join_Plsql - Fatal编程技术网

Sql 如何自联接重复行以显示为一行?

Sql 如何自联接重复行以显示为一行?,sql,oracle,join,plsql,Sql,Oracle,Join,Plsql,例如: Code T_ID 12345 1 12345 2 我想退回以下文件: Code H_T A_T 12345 1 2 我不太清楚这里的限制是什么,例如,您是否可以有两个以上的条目,代码=12345?,但请试着穿上这件衣服,看看尺寸: SELECT code, h_t, a_t FROM (

例如:

Code                  T_ID
12345                  1
12345                  2
我想退回以下文件:

 Code             H_T          A_T
 12345             1            2

我不太清楚这里的限制是什么,例如,您是否可以有两个以上的条目,代码=12345?,但请试着穿上这件衣服,看看尺寸:

SELECT code, h_t, a_t
FROM   (SELECT    code, MIN(t_id) AS h_t
        FROM      some_table
        GROUP BY  code) mins,
       (SELECT    code, MAX(t_id) AS a_t
        FROM      some_table
        GROUP BY  code) maxs
WHERE  mins.code = maxs.code

为了简化答案,了解是否有关于重复项的模式/概括是有帮助的

1您的示例仅显示了1个副本。是代表,还是超过1个dup? 如果只有一个副本是可能的,那么最简单的解决方案是没有连接。。。只需分组:

SELECT Code 
   ,H_T = MIN(T_ID)
   ,A_T = MAX(T_ID)
FROM <tableName>  (NOLOCK) 
GROUP BY Code
2您的示例显示了从1开始的连续自然数。他们总是1点开始吗?它们总是连续的吗?它们能飞多高? 任何像这样的有效泛化都将允许您简化代码。。。也许比下面的更简单

例如,如果我们假设重复项不是连续的,并且不总是从1开始,但我们也假设我们最多只需要报告10个重复项, 然后我们可以引入一个连续的行号,从1开始,然后链接到该行号

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_NAME = 'zz_DupsReport_table1')
    DROP TABLE dbo.zz_DupsReport_table1
SELECT R_NUM = ROW_NUMBER()
            OVER(PARTITION BY Code
                ORDER BY T_ID)
    ,Code
    ,T_ID
INTO dbo.zz_DupsReport_table1
FROM <tableName>  (NOLOCK) 
ORDER BY Code, T_ID

SELECT Code
    ,H_T = T01.T_ID
    ,A_T = T02.T_ID
    ,B_T = T03.T_ID
    ,C_T = T04.T_ID
    ,D_T = T05.T_ID
    ,E_T = T06.T_ID
    ,F_T = T07.T_ID
    ,G_T = T08.T_ID
    ,I_T = T09.T_ID
    ,J_T = T10.T_ID
    ,Over10found = CASE  WHEN Txx.Code IS NULL  THEN 'N'  ELSE 'Y'  END
FROM <tableName>  ORIG (NOLOCK) 
  LEFT OUTER JOIN dbo.zz_DupsReport_table1  T01 (NOLOCK)
      ON T01.Code = ORIG.Code  AND T01.R_NUM = 1
  LEFT OUTER JOIN dbo.zz_DupsReport_table1  T02 (NOLOCK)
      ON T02.Code = ORIG.Code  AND T02.R_NUM = 2
  LEFT OUTER JOIN dbo.zz_DupsReport_table1  T03 (NOLOCK)
      ON T03.Code = ORIG.Code  AND T03.R_NUM = 3
  LEFT OUTER JOIN dbo.zz_DupsReport_table1  T04 (NOLOCK)
      ON T04.Code = ORIG.Code  AND T04.R_NUM = 4
  LEFT OUTER JOIN dbo.zz_DupsReport_table1  T05 (NOLOCK)
      ON T05.Code = ORIG.Code  AND T05.R_NUM = 5
  LEFT OUTER JOIN dbo.zz_DupsReport_table1  T06 (NOLOCK)
      ON T06.Code = ORIG.Code  AND T06.R_NUM = 6
  LEFT OUTER JOIN dbo.zz_DupsReport_table1  T07 (NOLOCK)
      ON T07.Code = ORIG.Code  AND T07.R_NUM = 7
  LEFT OUTER JOIN dbo.zz_DupsReport_table1  T08 (NOLOCK)
      ON T08.Code = ORIG.Code  AND T08.R_NUM = 8
  LEFT OUTER JOIN dbo.zz_DupsReport_table1  T09 (NOLOCK)
      ON T09.Code = ORIG.Code  AND T09.R_NUM = 9
  LEFT OUTER JOIN dbo.zz_DupsReport_table1  T10 (NOLOCK)
      ON T10.Code = ORIG.Code  AND T10.R_NUM = 10
  LEFT OUTER JOIN (SELECT DISTINCT Code  
                   FROM dbo.zz_DupsReport_table1  SUBQ (NOLOCK)
                   WHERE SUBQ.R_NUM > 10
                  ) AS Txx
      ON Txx.Code = ORIG.Code
3如果您想要无限数量的重复项,因此列的数量不可预测,您可能需要进入递归,和/或将SELECT构建为字符串,并使用EXEC执行。 如果是这样的话,就这么说吧,我可以提供更多细节

希望有帮助,
-Doug

是的,您可以而且将有两个以上的条目。。我会尝试一下这个查询不会假设每个代码的条目数,但是如果你能澄清你的问题以及你到底想实现什么,那么就更容易为你提供正确的答案了它只适用于这两个条目数,但不适用于表中的所有代码,因为它使用min,麦克斯,不过做得很好,谢谢you@user1683987您在问题陈述中没有说将有两个以上的条目。我在第2点下编辑了代码:在第一次选择中额外添加了一个逗号,在第一次选择的末尾添加了一个ORDER BY,并更正了第二次选择中的列名,以便只使用COLUMNAME H_T一次。