【问题标题】:Different results while inserting into temp table and table variable插入临时表和表变量时的不同结果
【发布时间】:2019-04-25 05:17:32
【问题描述】:

当我使用表变量来存储这样的查询结果时:

INSERT INTO @sortedArticleIds
    SELECT article_id, NULL AS groupBy
    FROM #articleIds a
    GROUP BY article_id
    ORDER BY MIN(sortBy) DESC;

插入到@sortedArticleIds 的行随机变化。

但如果我像这样使用#table

INSERT INTO #tmp_table
    SELECT article_id, NULL AS groupBy
    FROM #articleIds a
    GROUP BY article_id
    ORDER BY MIN(sortBy) DESC;

插入到#tmp_table 的行总是相同的。

我使用的是 SQL Server 2008 R2。

【问题讨论】:

  • 你的意思是插入到@sortedArticleIds 的行随机变化
  • 当我再次执行相同的查询时,插入到变量中的记录会随机变化。但#articleIds 拥有相同的记录。
  • 插入行的顺序无关紧要,从表中获取结果时始终使用 order by,即使记录看起来已经按顺序存储。

标签: sql-server stored-procedures sql-server-2008-r2 temp-tables table-variable


【解决方案1】:

在关系数据库中,您的表是一个集合。这意味着不需要您插入的ORDER BY 和您的GROUP BY

INSERT INTO @sortedArticleIds
SELECT article_id, NULL AS groupBy
FROM #articleIds

这里你正在更新一个表,所以我们不需要ORDER BY 子句。

但是当您要查询表时,更喜欢这样的查询。

SELECT *
FROM @sortedArticleIds
GROUP BY article_id
ORDER BY MIN(sortBy) DESC;

【讨论】:

  • 感谢您的帮助,但是当我使用 #table 时,这会返回相同的结果。在上述情况下,使用 table 变量与 #table 是否有任何尊重。
  • 可以在查询前开启统计,看看是否有差异。
猜你喜欢
  • 1970-01-01
  • 2015-04-28
  • 2015-11-12
  • 1970-01-01
  • 2023-03-18
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
相关资源
最近更新 更多