【问题标题】:Getting subquery error using string_agg function使用 string_agg 函数获取子查询错误
【发布时间】:2022-02-08 04:52:39
【问题描述】:

我正在使用 SQL Server Management Studio 2017,我有一个 SELECT 语句,我在子查询中使用 STRING_AGG 函数,例如:

SELECT
    [p].[test],
    [p].[test], 
    ....
    (SELECT [Customers] 
     FROM 
         (SELECT
              STRING_AGG([C].[Name] , ', ') AS [Customers]
          FROM 
              [Project] AS [P]
          RIGHT JOIN 
              [ProjectCustomer] AS [PC] ON [P].[ProjectKey] = [PC].[ProjectKey]
          INNER JOIN 
              [Customer] AS [C] ON [PC].[CustomerKey] = [C].[CustomerKey]
          GROUP BY
              [P].[Name]) AS [t])
FROM 
    ...

问题是当我执行它时,我得到了这个异常:

子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

但是,如果我将子查询作为单独的选择运行,它会运行并且只返回一个字符串值。有人可以解释一下我在那里做错了什么吗?问候

【问题讨论】:

  • 错误信息的哪一部分不清楚?您的子查询返回不止一行。调试是程序员工作的一部分。您是否尝试过运行内部查询并查看返回了多少行?

标签: sql sql-server tsql


【解决方案1】:

这种结构没有意义。我猜你想要:

select . . . ,
       (select string_agg(c.name, ', ')
        from ProjectCustomer pc join
             customers c
             on c.CustomerKey = pc.CustomerKey
        where p.ProjectKey = pc.ProjectKey
       ) as customer_names
from p;

顺便说一句,我想不出这些表还有什么用处。但这只是基于您的查询的猜测。

【讨论】:

    【解决方案2】:

    在同一个子查询中使用 GROUP BY 和 STRING_AGG 时,我遇到了相同的错误消息。我添加了另一个子查询级别来让我的工作。在你的例子中,我会这样写:

    SELECT
      STRING_AGG(distinct_customers.[Name] , ', ') AS [Customers]
    FROM
    (
        SELECT
          [C].[Name]
        FROM 
          [Project] AS [P]
        RIGHT JOIN 
          [ProjectCustomer] AS [PC] ON [P].[ProjectKey] = [PC].[ProjectKey]
        INNER JOIN 
          [Customer] AS [C] ON [PC].[CustomerKey] = [C].[CustomerKey]
        GROUP BY
          [P].[Name]) AS [t]
    ) AS distinct_customers
    

    【讨论】:

      猜你喜欢
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      相关资源
      最近更新 更多