【问题标题】:Subquery returned more than 1 value. This is not permitted when the subquery子查询返回超过 1 个值。子查询时不允许这样做
【发布时间】:2017-12-22 09:24:08
【问题描述】:

我正在尝试使用 SQL 从 SCCM 返回 Windows 更新合规性数据,我已从内置 SSRS 报告中提取查询。

我没有为每个@colname(计算机组)运行单独的查询,而是尝试通过将@colname 声明为一个表并插入多个值来合并为一个查询。

SQL返回的错误是:

消息 512,第 16 级,状态 1,第 6 行
子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

我的代码:

DECLARE @title VARCHAR(500);
DECLARE @colname TABLE (name VARCHAR(100));

SET @title = 'ADR | Workstation Software Updates 2017-12-14 09:01:38';

INSERT INTO @colname   
VALUES ('All Alpha Workstations'), ('All Beta Workstations'), ('All Delta Workstations');

SELECT DISTINCT
    COUNT(*) [Total Clients], li.title, coll.name,
    SUM(CASE WHEN ucs.status = 3 OR ucs.status = 1 THEN 1 ELSE 0 END) AS 'Installed / Not Applicable',
    SUM(CASE WHEN ucs.status = 2 THEN 1 ELSE 0 END) AS 'Required',
    SUM(CASE WHEN ucs.status = 0 THEN 1 ELSE 0 END) as 'Unknown',
    ROUND((CAST(SUM(CASE WHEN ucs.status = 3 OR ucs.status = 1 THEN 1 ELSE 0 END) AS float) / COUNT(*)) * 100, 2) AS 'Success %',
    ROUND((CAST(COUNT(CASE WHEN ucs.status NOT IN ('3', '1') THEN '*' END) AS FLOAT) / COUNT(*)) * 100, 2) AS 'Not Success%'
FROM
    v_Update_ComplianceStatusAll UCS
INNER JOIN
    v_r_system sys ON ucs.resourceid = sys.resourceid
INNER JOIN 
    v_FullCollectionMembership fcm ON ucs.resourceid = fcm.resourceid
INNER JOIN
    v_collection coll ON coll.collectionid = fcm.collectionid
INNER JOIN
    v_AuthListInfo LI ON ucs.ci_id = li.ci_id
WHERE 
    li.title = @title 
    AND coll.name = (SELECT name FROM @colname) --and ucs.status=2
GROUP BY
    li.title, coll.name
ORDER BY
    1

任何帮助表示赞赏。 谢谢

【问题讨论】:

  • 错误信息很清楚,你的(select name from @collname)返回超过1个值。
  • 很明显它返回了超过 1 个值,是的。但我需要有关如何处理多个值的帮助。

标签: sql-server reporting-services sccm


【解决方案1】:

子查询select name from @collname返回多个值,这就是你不能使用=的原因。

使用IN 谓词代替=

where li.title=@title and coll.name in (select name from @collname)

【讨论】:

    【解决方案2】:

    为什么要为此使用 Table 变量?没有必要(表变量总是期望返回 1 行,除非您使用的是 100 的 2017 年)。这可能对您的查询性能产生重大影响。

    只要做:

    and coll.name IN ('All Alpha Workstations','All Beta Workstations','All Delta Workstations')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-04
      • 2016-08-02
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多