【问题标题】:Union of multiple selects based on different parameters values in sql serversql server中基于不同参数值的多选联合
【发布时间】:2022-01-24 09:55:54
【问题描述】:

我想在 sql server 中有以下功能:(PSEUDOCODE)

FOR @PARAM IN (value1, value2, ..., valueN)
     UNION(select @PARAM as window_id, variable1,*  from TABLE where variable1<=@PARAM)

我的意思是,@PARAM 的每个值都表示一个不同的窗口,我想为此运行上面的选择,然后将它们合并。 ¿ 有没有什么方法可以在 sql server 中方便地做到这一点?

【问题讨论】:

  • 你的问题不是很清楚。请尝试edit它按照sql tag info中的说明包含样本数据和预期结果@
  • 为什么要通过@param 进行间接寻址? select id from TABLE where id IN (value1, value2, ..., valueN) 会不会容易得多?
  • 我已经更新了问题,希望现在更清楚

标签: sql sql-server dynamic-sql sql-parametrized-query


【解决方案1】:

我建议将此 @param 值存储在一个表中,并将其用作 while 循环中的输入

FOR 循环在 sql server 中不可用。

create table input_value (id int identity(1,1),val int)

insert into input_value(val)
values(<your param values>)

--新建一个与源表结构相同的空表来存储运行时结果集

select 1 as int,variable1 as new_v2, * into #table from  TABLE where variable1 <> variable1

declare @i int = 1, @end int = 0, @param int

select @end = max(id) from input_value
while @end>= @i
begin
select @param = val from input_value where id = @i
insert into #table
select @PARAM as window_id, variable1,*  from TABLE where variable1<=@PARAM

set @i  = @i+1
end
select * from #table

注意:每次必须截断 input_value 表才能运行此代码,truncate 会将标识重置为 1 并删除旧记录

【讨论】:

    【解决方案2】:

    您可以只加入 VALUES 虚拟表

    SELECT
      v.window_id,
      t.variable1
    FROM (VALUES
        (@value1),
        (@value2)  -- etc...
    ) v(window_id)
    JOIN [TABLE] t ON t.variable1 <= v.window_id;
    

    我建议您尽管使用表值参数或表变量来执行此连接。如果您在现有表中有这些参数,则可以改为加入该表。

    【讨论】:

      猜你喜欢
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 2015-02-03
      • 2021-12-03
      • 1970-01-01
      相关资源
      最近更新 更多