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 的输出可能应该被缓存,因为它将
- 通过当前 ID 指示哪些行需要添加到您的报告中
- 稍后可用于更新您的日程表中引用的 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
我有一个具有多对多关系的 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 的输出可能应该被缓存,因为它将
- 通过当前 ID 指示哪些行需要添加到您的报告中
- 稍后可用于更新您的日程表中引用的 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