SQL - 在1个变量或列中合并多个查询的结果

时间:2016-12-01 07:27:26

标签: sql sql-server

我想在1列或变量中合并多个查询的结果。 我有这个查询: -

select Id from EmployeeDetail where Code = 'ABC1'
select Id from EmployeeDetail where Code = 'ABC2'

... So  On till ABC200

我希望1变量中的所有ID都能进一步使用它。

我正在尝试使用foreach来实现这个目标。如何在1变量中获取它以在进一步的不同查询中使用它。

我已经尝试过以下示例来获取1个连接变量中的字符串: - 下面的代码只是一个试验,它不是在实际查询中。

declare @num int
declare @num1 VARCHAR(MAX)

set @num = 1

declare @results table ( val int )

while (@num < 84)
begin
  insert into @results ( val ) values ( @num )
  set @num = @num + 1
  set @num1 += '5000'
  select @num1
end

4 个答案:

答案 0 :(得分:1)

如果您提取的EmployeeDetail代码全部匹配某些模式,那么您可以使用下面的简单查询实现您想要的目标:

view.post()

运行后,变量@AllIDs将包含用&#39;,&#39;分隔的所有ID。

答案 1 :(得分:0)

据我所知,您希望将所有ID的结果与代码连接为ABC1,ABC2,... ABC200。检查我的下面的解决方案,希望它可以帮助你。

declare @num int
declare @text VARCHAR(MAX)

set @text = 'ABC'
set @num = 1

declare @results table ( val varchar(10) )

while (@num <= 200)
begin
  insert into @results ( val ) values (@text + cast(@num as varchar(3)) )
  set @num = @num + 1
end

Select ID from EmployeeDetail where Code in (Select val from @results)

答案 2 :(得分:0)

问题可分为两部分

  1. 生成变量值。
  2. 过滤步骤1中生成的数据的结果。

    --Step 1
    
    declare @num int
    declare @text VARCHAR(MAX)
    
    set @text = 'ABC'
    set @num = 1
    
    declare @results table ( val varchar(10) )
    
    while (@num <= 200)
    begin
      insert into @results ( val ) values (@text + cast(@num as varchar(3)) )
      set @num = @num + 1
    end
    
    --Step 2
    
    Select ID from EmployeeDetails e
    inner join @results r on r.val=e.Code
    

答案 3 :(得分:0)

-- Prepare the data
DECLARE @EmployeeDetail TABLE (Id int identity(1,1), Code varchar(10))
INSERT @EmployeeDetail VALUES ('ABC1'), ('ABC2'), ('DEF'), ('ABC3')

DECLARE 
    @CodePattern varchar(10) = 'ABC',
    @RangeFrom int = 1,
    @RangeTo int = 200

DECLARE @Ids varchar(max) = (SELECT STUFF((
    SELECT ',' + CAST(Id AS varchar(10)) 
    FROM @EmployeeDetail 
    WHERE 
        -- The pattern of the code is prefix + number
        -- Can use LIKE and BETWEEN to replace your multiple query
        code LIKE @CodePattern + '%' 
        AND SUBSTRING(code, LEN(@CodePattern) + 1, 10) BETWEEN @RangeFrom AND @RangeTo
    FOR XML PATH('')
), 1, 1, ''))

PRINT @Ids