【问题标题】:Get result and ids variable in 1 SELECT statement在 1 个 SELECT 语句中获取结果和 ids 变量
【发布时间】:2016-12-21 12:07:12
【问题描述】:

我有一个复杂的选择语句,我想返回到应用层。同时我想重用这个语句中的 id。我来到了这样的表变量解决方案

DECLARE @Result TABLE (SortOrder int IDENTITY, Id bigint, data_columns, PRIMARY KEY (Id))
INSERT INTO @Result
SELECT Id, data_columns ...

--output to the app layer
SELECT Id, data_columns FROM @Result ORDER BY SortOrder;

--using @Result Id elsewhere

SortOrder 用于保持第一次选择的原始顺序。没有它,我在 ms sql server 2012 中遇到了一个奇怪的错误。 PRIMARY KEY (Id) 用作提示优化器 Id 值是唯一的。 SortOrder 与 Id 不相关。

现在我担心内存和 CPU 过载。谁有更好的解决方案?

----- 补充: 这可以是一个答案

DECLARE @Ids TABLE (Id bigint, PRIMARY KEY (Id));

MERGE @Ids AS ids
USING (SELECT TOP 9223372036854775807 Id, data_columns ...) AS result
ON 1=0
WHEN NOT MATCHED THEN
INSERT VALUES(result.Id)
OUTPUT result.*; --output to the app layer here

--using @Ids Id elsewhere 

我可以确认它适用于我的样品并且需要更少的时间。 但我仍然担心 OUTPUT 中的顺序。

TOP hack 解释MERGE INTO insertion order

MSDN 也说

无法保证应用更改的顺序 到表和插入行的顺序 输出表或表变量会对应。

幸运的是,我不关心@Ids 表中的顺序。但重要的是要在 OUTPUT 子句中获得与 USING () 中相同的顺序

【问题讨论】:

  • 有什么顾虑?是什么导致了这些担忧?
  • 1.表变量的大小。我不需要在输出后存储 data_columns
  • 没有足够的信息可供任何人帮助您。您所说的“表格大小”是什么意思?
  • 你还遇到了什么奇怪的错误?我很确定这是否只是您获取数据的顺序,这根本不是错误。

标签: sql sql-server


【解决方案1】:

在我看来,您正在尝试保持特定的排序顺序,在这种情况下,您可以使用 ROW_NUMBER 来产生所需的效果:

  SELECT ROW_NUMBER() OVER(ORDER BY OriginalSortingColumns) AS SortOrder                  
       , data_columns 
    FROM sourcetable 

但如果不了解您的程序的目的以及数据的结构和性质,我无法确定。非常值得阅读本指南 - How do I ask a good question? - 以确保您提供我们需要的所有信息,以便快速为您提供出色的答案。

正如 cmets 所说,您永远不能依赖键来排序数据,这就是 ORDER BYstatement 的用途。

【讨论】:

  • 感谢您的回复。我在问一个技术问题。我相信在 SELECT 语句中提供详细信息而不是三个点会给我部分答案。我对我的问题做了另一个补充
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
相关资源
最近更新 更多