根据表中已有的行插入临时表

时间:2014-01-08 20:44:12

标签: sql sql-server performance insert

我正在构建一个包含不同类别,项目和成本的临时表#Table。

例如:

Category    Item    Cost
--------    ----    ----
Office      Desk    100.00
Office      Chair   75.00
Office      PC      800.00
Home        Desk    0.00

在我收到临时表进行处理时,有个别行包含Category,Item和Cost以及Summary行,其中包含每个类别总和非零的总和:

Category    Item    Cost    Type
--------    ----    ----    -----
Office      Desk    100.00  Cost
Office      Chair   75.00   Cost
Office      PC      800.00  Cost
Office      null    975.00  Summary
Home        Desk    0.00    Cost

我现在也要为$ 0.00成本行添加摘要行,但是我很难弄清楚如何这样做。

INSERT INTO #Table
SELECT X.Category, null, 0.00, 'Summary'
FROM #Table X
...[Get Category data that does not have a Summary row]

我曾想过

WHERE NOT EXISTS ( SELECT * FROM #Table Y WHERE Y.Category = X.Category AND Type = 'Summary')
GROUP BY X.Category

但我担心性能,因为此表中可能有很多行。

2 个答案:

答案 0 :(得分:0)

您应该对性能进行基准测试,但我发现连接速度更快。此外,如果您的数据集非常大,则在将数据加载到临时表后添加索引可以显着加快后续表查询的速度。

INSERT INTO #Table
   SELECT X.Category, null, 0.00, 'Summary'
   FROM #Table X
   LEFT JOIN #Table Y ON Y.Category = X.Category AND Y.Type = 'Summary'
   WHERE Y.Category IS NULL

答案 1 :(得分:0)

如何分两步完成 -

1 - 直接插入原始数据 - 没有摘要信息 2 - 插入更多数据 - 按类别选择数据分组,使用SUM聚合成本,并对项目&amp ;;硬编码NULL类型字段的摘要。