【问题标题】:This is not permitted when the subquery follows Subquery returned more than 1 value当子查询跟随子查询返回超过 1 个值时,这是不允许的
【发布时间】:2019-10-13 03:46:46
【问题描述】:

我在将值返回到列清单百分比时遇到问题。它给出了错误“子查询返回了超过 1 个值。当子查询遵循 =,!= 时,这是不允许的,”提供的表只是来自具有许多评估的数千行的样本。

表格是 2,我从数千行中提取了这个样本:

╔═════════╦═══════════════╗    
║ id      ║ value_integer ║
╠═════════╬═══════════════╣   
║ 2059064 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2064435 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2064889 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2064893 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2086272 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2128447 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2128447 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2128447 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2134036 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2163046 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2175279 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2175279 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2186928 ║ NULL          ║
╠═════════╬═══════════════╣

第二张桌子是:

╔═════════╦════════════╗
║ id      ║ evaluation ║
╠═════════╬════════════╣
║ 2059064 ║ 0          ║
╠═════════╬════════════╣
║ 2064435 ║ 0          ║
╠═════════╬════════════╣
║ 2064889 ║ 0          ║
╠═════════╬════════════╣
║ 2064893 ║ 0          ║
╠═════════╬════════════╣
║ 2086272 ║ 50001      ║
╠═════════╬════════════╣
║ 2128447 ║ 0          ║
╠═════════╬════════════╣
║ 2128447 ║ 0          ║
╠═════════╬════════════╣
║ 2128447 ║ 50001      ║
╠═════════╬════════════╣
║ 2134036 ║ 50001      ║
╠═════════╬════════════╣
║ 2163046 ║ 50001      ║
╠═════════╬════════════╣
║ 2175279 ║ 50006      ║
╠═════════╬════════════╣
║ 2175279 ║ 50001      ║
╠═════════╬════════════╣
║ 2186928 ║ 50004      ║
╠═════════╬════════════╣
║ 2190848 ║ 50001      ║
╠═════════╬════════════╣
║ 2190848 ║ 0          ║
╠═════════╬════════════╣
║ 2190848 ║ 0          ║
╠═════════╬════════════╣
║ 2190848 ║ 1          ║
╠═════════╬════════════╣
║ 2190848 ║ 1          ║
╠═════════╬════════════╣
║ 2222107 ║ 1          ║
╠═════════╬════════════╣
║ 2250093 ║ 1          ║
╠═════════╬════════════╣
║ 2250093 ║ 1          ║
╠═════════╬════════════╣
║ 2250093 ║ 50005      ║
╠═════════╬════════════╣
║ 2250093 ║ 0          ║
╠═════════╬════════════╣
╚═════════╩════════════╝

目的是计算所选评价/总评价的百分比。评价50001为是,0和1分别表示未评价或未选择。

 UPDATE DB.D_ENERGY_REFERENCE
    SET D_ENERGY_REFERENCE.VALUE_INTEGER = (SELECT  (SELECT CAST(COUNT(EVALUATION) AS FLOAT)
                                                     FROM DB.D_CHECK_LIST D_CHECK_LIST
                                                     WHERE D_CHECK_LIST.EVALUATION  = 50001
                                                     GROUP BY ID) / (SELECT CAST(COUNT(EVALUATION) AS FLOAT)
                                                                     FROM DB.D_CHECK_LIST D_CHECK_LIST
                                                                     WHERE D_CHECK_LIST.EVALUATION  NOT IN (0,1)
                                                                     GROUP BY ID) * 100
                                            FROM DB.D_CHECK_LIST D_CHECK_LIST 
                                            WHERE D_CHECK_LIST.ID IN (SELECT ID
                                                                      FROM DB.D_ENERGY_REFERENCE  
                                                                      WHERE ID = D_CHECK_LIST.ID))

【问题讨论】:

  • 您的一个子查询返回了多条记录。尝试单独运行它们,你会发现你的问题
  • 我做到了,但被卡住了。它在单独的选择语句中赋予价值
  • 你都试过了吗?嵌套的和外部的?
  • 如果我们在其中放一些制表符,我们可以看到 yuio 甚至没有关闭所有的括号。但是该子查询肯定会返回多行,因为它为表D_CHECK_LIST 中的每个ID 值返回一行,该表也在表D_ENERGY_REFERENCE 中。或许您最好在这里展示您的数据和预期结果。
  • 越看查询,越不明白它的目的是什么。直到现在我才意识到,但是子查询中的子查询甚至会返回多行,因为ID 上有一个GROUP BY。这些查询都没有使用横向连接来限制返回的结果,所以我实际上不知道这个阶段的 OP 是什么。

标签: sql sql-server


【解决方案1】:

我认为您正在寻找如下更新脚本-

注意:请先尝试测试数据。

UPDATE T
SET T.VALUE_INTEGER = A.Val
FROM D_ENERGY_REFERENCE T
INNER JOIN 
(
    SELECT 
    ID,
    CASE 
        WHEN CAST(COUNT(CASE WHEN D_CHECK_LIST.EVALUATION  NOT IN (0,1) THEN EVALUATION ELSE NULL END) AS FLOAT) = 0 THEN 0
        ELSE
        (
            CAST(COUNT(CASE WHEN D_CHECK_LIST.EVALUATION  = 50001 THEN EVALUATION ELSE NULL END) AS FLOAT)
            /
            CAST(COUNT(CASE WHEN D_CHECK_LIST.EVALUATION  NOT IN (0,1) THEN EVALUATION ELSE NULL END) AS FLOAT)
        ) * 100 
    END AS Val
    FROM D_CHECK_LIST
    GROUP BY ID
)A ON T.ID = A.ID

【讨论】:

  • 我遇到错误 ')' 附近的语法不正确。在第 9 行,当 D_CHECK_LIST.EVALUATION = 50001 THEN EVALUATION ELSE NULL)
  • 很遗憾,CASE 语句没有正确结束。请立即尝试。
  • 谢谢。现在的错误是遇到除以零错误。
  • 这很容易处理。
  • 谢谢。按预期工作。干杯
猜你喜欢
  • 2012-06-04
  • 2016-08-02
  • 1970-01-01
  • 2022-11-02
  • 2017-03-10
相关资源
最近更新 更多