【问题标题】:Select Top into Different Variables选择顶部进入不同的变量
【发布时间】:2013-10-23 23:42:25
【问题描述】:

可能不可能,但我想我会问;

我想获取Top 并将每个保存到不同的变量中。我知道可以通过 3 次选择并从 Top 3 中选择第 1、第 2、第 3,但我希望它可能在一个语句中?

I.E.

Declare @Var1 as int,
Declare @Var2 as int,
Declare @Var3 as int
select Top 3 [SAVE 3 RETURNED RECORDS INTO VARIABLES] from Table

【问题讨论】:

  • Top 按什么排序。
  • 我正在订购一个 Created On 字段。
  • 添加 row_number 并使用它?

标签: sql-server select


【解决方案1】:

假设出于演示目的,您需要TOP 3 schema_id FROM sys.objects ORDER BY object_id

Declare @Var1 as int;
Declare @Var2 as int;
Declare @Var3 as int;


WITH T AS
(
SELECT *,
       ROW_NUMBER() OVER (ORDER BY object_id) RN
FROM sys.objects
)
SELECT @Var1 = MAX(CASE WHEN RN = 1 THEN schema_id END),
       @Var2 = MAX(CASE WHEN RN = 2 THEN schema_id END),
       @Var3 = MAX(CASE WHEN RN = 3 THEN schema_id END)
FROM T 
WHERE RN <= 3;

SELECT @Var1, @Var2, @Var3

它使用ROW_NUMBER 对行进行编号,然后将它们转换为用于分配给变量的单行结果。

【讨论】:

  • "操作数数据类型 uniqueidentifier 对 max 运算符无效。"在这种情况下,我的 schema_id 是一个 uniqueid。
  • @windowskm - @Var1 = CAST(MAX(CASE WHEN RN = 1 THEN CAST(schema_id AS BINARY(16)) END) AS UNIQUEIDENTIFIER) 将完成这项工作。
  • “结果空间不足,无法将 uniqueidentifier 值转换为 char。警告:空值已被聚合或其他 SET 操作消除。”
  • @windowskm - 将变量声明为 uniqueidentifier 而不是 char。或者至少将其设为char(36)(如果它们必须是字符串)。你可以忽略警告。
  • 感谢实际上让 Kaf 的版本也为我工作,但我会把它给你,因为你让我在那里。不过,全场投票。谢谢大家
【解决方案2】:

这是another way

Declare @Var1 as int, @Var2 as int, @Var3 as int
Declare @rn int = 1

select top(3) @Var1 = case when @rn = 1 then val else @var1 end,
              @Var2 = case when @rn = 2 then val else @var2 end,
              @Var3 = case when @rn = 3 then val else @var3 end,
              @rn += 1 
from t
order by val

select @var1, @var2, @var3

【讨论】:

  • 您能找到任何保证@rn += 1 将在 SELECT 中的其他三个项目之后执行的文档吗?
  • @MartinSmith, @rn +=1 总是紧挨着当前的。
  • @windowskm,它适用于小提琴,请检查链接。看不到任何语法错误。不确定这是否是语法的原因,但您运行的是什么版本的 sql-server?以 2008 年为例。
  • @Kaf - “SQL Server 不保证表达式的计算顺序。请注意,只有在分配之间存在引用时,效果才可见。” Quote
  • @MartinSmith:我认为这与单行选择有关,Select @var1 = col1, @var2 = col2 .. 不能保证首先分配@var1 还是@var2。关于在该引用之后开始的多行的声明。是的,我无法证明内部发生了什么或不同意你的观点,但 10/10 次查询会带来相同的结果。
猜你喜欢
  • 2016-02-26
  • 1970-01-01
  • 2011-06-03
  • 2015-02-27
  • 2021-09-14
  • 2013-04-22
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多