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:单行子查询返回多于一行的主要内容,如果未能解决你的问题,请参考以下文章