将Select(多个结果)的结果存储在变量中(以后在in语句中使用)

时间:2018-05-08 18:54:37

标签: sql sql-server tsql variables subquery

我正在尝试将选择查询中的多个结果集存储到变量中 我希望在一周内收到所有事件,我在特定周的标准下使用事件表中的“选择类似”。 想要将其存储为变量,我可以在另一个查询的where子句中使用,以获得一周内每个技能所包含的客户数量。 我不能使用一个集合,因为我想返回多个值,并且在这个中,使用select,只返回最后一个值。(我实际上收到一个错误,但我的假设来自之前关于该主题的阅读)
我不确定的三件事:

  1. 如何将其设置为格式化为以后的
  2. 如何在Select
  3. 中为我的变量存储多个值
  4. 用于实现逗号分隔字符串的格式 值(撇号之间的结果)
  5. 我的第一个查询(declare / select)返回撇号之间的所有结果。我需要找到一种方法将它们组合起来并将它们分开并将它存储在我的变量中 第二个查询工作正常并返回我想要的,如果我手动输入我的值中的撇号之间的逗号分隔值而不是变量,以便该部分正常。

    Declare @IDC varchar(500);
    SELECT @IDC = (SELECT '''' + E.NO_EVENT + '''' FROM TEST_APP.dbo.EVENT E
    WHERE E.NO_EVENT like '1819________')
    
    SELECT COUNT(L.SKILL) as qty, L.SKILL FROM TEST.dbo.LEADS L
    WHERE L.NO_Event in (@IDC)
    group by L.SKILL
    

    我尝试了小变化但无济于事,并对该主题进行了一些研究,但显然只能将单个结果存储为变量。
    执行上面的查询会返回我:

      

    Msg 512,Level 16,State 1,Line 2   子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

2 个答案:

答案 0 :(得分:1)

您需要使用表变量/临时表来存储多个值:

SELECT E.NO_EVENT 
INTO #temp
FROM TEST_APP.dbo.EVENT E
WHERE E.NO_EVENT like '1819________'

如果您使用的是SQL Server 2017,则可以使用STRING_AGG/STRING_SPLIT

Declare @IDC varchar(500);
SELECT @IDC = (SELECT STRING_AGG(E.NO_EVENT, ',') 
               FROM TEST_APP.dbo.EVENT E
               WHERE E.NO_EVENT like '1819________');

然后:

SELECT COUNT(L.SKILL) as qty, L.SKILL FROM TEST.dbo.LEADS L
WHERE L.NO_Event in (SELECT * FROM STRING_SPLIT(@IDC, ',') s)
group by L.SKILL;

答案 1 :(得分:0)

创建一个表变量,然后像这样插入:

declare @table table (col1 int, col2 varchar(max))...
insert @table 
select...