SQL同一个查询输出不同的结果集
SQL Different output result set for same query
为什么此 SQL 查询在 SQL 2008R2 中产生不同的输出结果,而 2012.It 似乎此查询的 2008R2 结果看起来 fine.Why 2012 年缺少相同的排序顺序?
Declare @TempTable TABLE (Name VARCHAR(25), RankOrder INT)
INSERT INTO @TempTable SELECT 'b', 2 UNION ALL SELECT 'd', 4 UNION ALL SELECT 'a', 1 UNION ALL SELECT 'e', 5 UNION ALL SELECT 'c', 3
SELECT * INTO #ResultTable FROM @TempTable ORDER BY RankOrder
SELECT * FROM #ResultTable
DROP TABLE #ResultTable
我们无法通过使用来自#ResultTable 的select * 来判断table 中的顺序是什么?无法保证 select 查询中的顺序。
但是,在大多数情况下,SQL Fiddle 上的结果集是不同的。如果要保证结果集应该相同,那就加一个主键。然后插入顺序将保持不变:
DECLARE @TempTable TABLE (Name VARCHAR(50), SortOrder INT)
INSERT INTO @TempTable SELECT 'b', 2 UNION ALL SELECT 'c', 3 UNION ALL SELECT 'a', 1 UNION ALL SELECT 'e', 5 UNION ALL SELECT 'd', 4
SELECT TOP 0 * into #ResultTable from @TempTable;
ALTER TABLE #ResultTable add id int identity(1, 1) primary key;
INSERT INTO #ResultTable(name, sortorder)
SELECT * FROM @TempTable
ORDER BY SortOrder;
SELECT * FROM #ResultTable
DROP TABLE #ResultTable
但在此之后我仍然会忽略从#ResultTable 执行select *。但是,是的,它在 SQL Server 2008 和 2012 中都以正确的顺序 return 它们。
因为SQL服务器保证主键以正确的顺序插入,在这种情况下也保证记录的顺序正确。
如果您在任何情况下遇到任何具体问题,请告诉我们,我们会尽力解决。
谢谢。
使用 SELECT ... INTO <new_table> ...
语句几乎忽略了 ORDER BY
语句。
来自 INTO clause 文档,限制和限制:
Specifying an ORDER BY clause does not guarantee the rows are inserted in the specified order.
你然后 SELECT
来自临时 table 的所有行没有 ORDER BY
子句,这也不能保证你将以什么顺序接收这些行。你会假设与插入行的顺序相同,但也不能保证该顺序是什么。
总而言之,您不能期望返回行的任何特定顺序,它们在同一 RDBMS 的不同版本中可能会有所不同。
为什么此 SQL 查询在 SQL 2008R2 中产生不同的输出结果,而 2012.It 似乎此查询的 2008R2 结果看起来 fine.Why 2012 年缺少相同的排序顺序?
Declare @TempTable TABLE (Name VARCHAR(25), RankOrder INT)
INSERT INTO @TempTable SELECT 'b', 2 UNION ALL SELECT 'd', 4 UNION ALL SELECT 'a', 1 UNION ALL SELECT 'e', 5 UNION ALL SELECT 'c', 3
SELECT * INTO #ResultTable FROM @TempTable ORDER BY RankOrder
SELECT * FROM #ResultTable
DROP TABLE #ResultTable
我们无法通过使用来自#ResultTable 的select * 来判断table 中的顺序是什么?无法保证 select 查询中的顺序。
但是,在大多数情况下,SQL Fiddle 上的结果集是不同的。如果要保证结果集应该相同,那就加一个主键。然后插入顺序将保持不变:
DECLARE @TempTable TABLE (Name VARCHAR(50), SortOrder INT)
INSERT INTO @TempTable SELECT 'b', 2 UNION ALL SELECT 'c', 3 UNION ALL SELECT 'a', 1 UNION ALL SELECT 'e', 5 UNION ALL SELECT 'd', 4
SELECT TOP 0 * into #ResultTable from @TempTable;
ALTER TABLE #ResultTable add id int identity(1, 1) primary key;
INSERT INTO #ResultTable(name, sortorder)
SELECT * FROM @TempTable
ORDER BY SortOrder;
SELECT * FROM #ResultTable
DROP TABLE #ResultTable
但在此之后我仍然会忽略从#ResultTable 执行select *。但是,是的,它在 SQL Server 2008 和 2012 中都以正确的顺序 return 它们。
因为SQL服务器保证主键以正确的顺序插入,在这种情况下也保证记录的顺序正确。
如果您在任何情况下遇到任何具体问题,请告诉我们,我们会尽力解决。
谢谢。
使用 SELECT ... INTO <new_table> ...
语句几乎忽略了 ORDER BY
语句。
来自 INTO clause 文档,限制和限制:
Specifying an ORDER BY clause does not guarantee the rows are inserted in the specified order.
你然后 SELECT
来自临时 table 的所有行没有 ORDER BY
子句,这也不能保证你将以什么顺序接收这些行。你会假设与插入行的顺序相同,但也不能保证该顺序是什么。
总而言之,您不能期望返回行的任何特定顺序,它们在同一 RDBMS 的不同版本中可能会有所不同。