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

标签 sql sql-server tsql variables subquery

我正在尝试将来自选择查询的多个结果集存储到一个变量中,
我想获取一周内包含的所有事件,我根据特定周的标准使用事件表中的“选择”。 想要将它存储为一个变量,我可以在另一个查询的 where 子句的一部分中使用它来获取一周内每种技能包含的客户数量。 我不能使用集合,因为我想返回多个值,并且在此情况下,使用一个选择,只返回最后一个值。(我实际上收到一个错误,但我的假设是从以前阅读的主题)
我不确定的三件事:

  1. 如何设置它的格式以便稍后包含在内
  2. 如何通过 Select 在我的变量中存储多个值
  3. 用于实现逗号分隔字符串的格式化 值(撇号之间的结果)

我的第一个查询(声明/选择)返回撇号之间的所有结果。我需要找到一种方法来组合它们并用昏迷将它们分开并将其存储在我的变量中。
如果我在我的值而不是变量中的撇号之间手动输入逗号分隔值,那么第二个查询工作正常并返回我想要的内容,所以这部分没问题。

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 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

最佳答案

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

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;

关于sql - 将 Select(多个结果)的结果存储在一个变量中(稍后在 in 语句中使用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50240514/

相关文章:

mysql - 在同一个表中选择多个条件

SQL 和外键 : How to link these two tables correctly?

sql-server - TSQL:从 SELECT 结果中插入或更新

sql - 从 SQL 中读取另存为文本的 XML

c# - 不留下未关闭的连接的正确方法是什么?

sql - 为什么在 'month' 中使用 'where' 时 SQL Server 返回不同的顺序?

php - 将 WP_Query 与自定义 SQL 一起使用?

sql - 查询以查找今天和昨天的数据以及伪列之间的差异

sql - 提取字符串中的最后一个数字

MySQL SELECT 查询包含位字段和字符串字段比较 NULL 返回空集