SQL 为每增加一个计数创建一个重复行

SQL Create a duplicate row for each additional count

我有一个具有多对多关系的 table,我需要在不修改架构的情况下进行 1 对 1。这是伪代码:

 Reports  { 
      Id INT,  
      Description NVARCHAR(256),
      ReportFields...  
 }
 ScheduledReports { 
    ScheduledReportId INT
    ReportId INT (FK)
    Frequency INT
 }

当我运行这个查询时:

SELECT [ReportID], COUNT(*) as NumberOfReports
FROM [ScheduledReports]
GROUP BY ReportId
HAVING COUNT(*) > 1

我得到 return 所有重复报告的结果。

ReportId,  NumberOfReports
   1,         2
   2,         4

Foreach 附加报告(例如 NumberOfReports -1)。
我需要在报告 table 中创建一个重复行。但是我在弄清楚如何将计数转换为连接时遇到了麻烦(因为我不想使用游标)。

这是我的查询:

INSERT INTO Reports (Description)
SELECT Description 
FROM Reports 
WHERE ReportId IN  (SELECT [ReportID]
                    FROM [ScheduledReports]
                    GROUP BY ReportId
                    HAVING COUNT(*) > 1)

我如何加入 ReportRow 本身 ​​Count(*) -1 次?

下面的查询应该可以让您对每个唯一报告的计划进行排序。然后,您可以使用 sequencing > 1 来确定需要将哪些值插入到您的报告 table 中。这个 select 的输出可能应该被缓存,因为它将

  1. 通过当前 ID 指示哪些行需要添加到您的报告中
  2. 稍后可用于更新您的日程表中引用的 ReportID table
SELECT * 
FROM (
    SELECT Reports.Id
        ,ScheduledReportId
        ,ROW_NUMBER() OVER (
            PARTITION BY ReportId
            ORDER BY ScheduledReportId
        ) AS [Sequencing]
    FROM Reports 
        INNER JOIN ScheduledReports on ScheduledReports.ReportId = Reports.Id
    WHERE ReportId IN  (SELECT [ReportID]
                        FROM [ScheduledReports]
                        GROUP BY ReportId
                        HAVING COUNT(*) > 1)) AS SequencedReportAndSchedules