Oracle SQL:ORA-01427:单行子查询返回多于一行

Posted

技术标签:

【中文标题】Oracle SQL:ORA-01427:单行子查询返回多于一行【英文标题】:Oracle SQL: ORA-01427: single-row subquery returns more than one row 【发布时间】:2021-05-26 08:40:05 【问题描述】:

我的 oracl sql 命令会尝试查找总费用高于平均费用的网络包费用。但它出现错误说:ORA-01427:单行子查询返回多于一行

“cost_per_hour”将在名为“menu”的实体中,而“start_hours”和“end_hours”将在名为“user_log”的实体中

这是我的代码:

SELECT
    network_pacakage
    to_char(cost_per_hours *(start_hours - end_hours)), '$999.99') AS total_costs
FROM
     menu m
    JOIN user_log ul ON m.package_id = ul.package_id
WHERE
    (
        SELECT
            cost_per_hours * (start_hours - end_hours)) AS total_charter_cost
        FROM
              menu m
            JOIN user_log ul ON m.package_id = ul.package_id
    ) > (
        SELECT
            AVG(cost_per_hours * (start_hours - end_hours)) AS ave_total_charter_cost
        FROM
                 menu m
            JOIN user_log ul ON m.package_id = ul.package_id
    )
ORDER BY
    total_costs DESC; 

您能提出解决方案吗?谢谢!

【问题讨论】:

你真的应该养成“点赞”任何你认为有帮助的回复的习惯,并尽可能“接受”其中一个! 【参考方案1】:

此查询导致的错误返回多于 1 行作为结果:

SELECT cost_per_hours * (start_hours - end_hours)) AS total_charter_cost
FROM menu m
JOIN user_log ul ON m.package_id = ul.package_id

你可能需要sum 来让这个子查询返回一个特定的值

【讨论】:

你能说得更具体些吗?所以它应该像 SELECT SUM(cost_per_hours * (start_hours - end_hours))) AS total_charter_cost ? 您的连接表可能有超过 1 行,然后从(超过 1 行的表)中选择返回超过 1 行。超过1行>1行不可比 但我认为在这个选择语句中,我计算了每个包装的成本。所以我不知道我该如何解决这个问题【参考方案2】:

这样的事情可以解决问题:

WITH average AS (
 SELECT AVG(cost_per_hours * (start_hours - end_hours)) AS ave_total_charter_cost
 FROM menu m -- likely you dont need this table for this query...
   JOIN user_log ul 
     ON m.package_id = ul.package_id
)
SELECT
  network_pacakage,
  to_char(cost_per_hours *(start_hours - end_hours)), '$999.99') AS total_costs
FROM menu m
  JOIN user_log ul 
      ON m.package_id = ul.package_id
  JOIN average a
      ON 1=1
WHERE cost_per_hours * (start_hours - end_hours) > a.ave_total_charter_cost
ORDER BY 2 DESC; 

我计算 cte (WITH) 中的平均值以避免多次计算此值。也许执行计划会在查询中执行,但以防万一......

【讨论】:

cost_per_hours * (start_hours - end_hours) 可以存在于where子句中吗? 是的,它充当计算字段来进行比较。我已更改ORDER BY,不确定您是否可以通过别名订购。【参考方案3】:

如果你想将每一行与平均值进行比较,你不需要再次选择它,只需使用选择的列:

WHERE
    cost_per_hours * (start_hours - end_hours) > 
    (SELECT AVG(cost_per_hours * (start_hours - end_hours))
     FROM menu m
     JOIN user_log ul ON m.package_id = ul.package_id
    )

【讨论】:

以上是关于Oracle SQL:ORA-01427:单行子查询返回多于一行的主要内容,如果未能解决你的问题,请参考以下文章

查询返回:ORA-01427 单行子查询返回多于一行

ORA-01427:单行子查询返回多个行

ORA-01427: 单行子查询返回多个行

ORA-01427:单行子查询返回多个行

ORA-01427:单行子查询返回多个行

ORA-01427:单行子查询返回多个行