如何从SQL中的子查询中获取具有最小值的行?
我有一个表Saledetail,其中包含prodid和Quantity列。我想从该表中获取数量总和最小的prodid 在经历了以下资源之后: 我写了这个查询如何从SQL中的子查询中获取具有最小值的行?,sql,oracle,oracle12c,Sql,Oracle,Oracle12c,我有一个表Saledetail,其中包含prodid和Quantity列。我想从该表中获取数量总和最小的prodid 在经历了以下资源之后: 我写了这个查询 select prodid, sum(quantity) as k from saledetail group by prodid 其输出为: +--------+----+ | PRODID | K | +--------+----+ | 102 | 11 | | 101 | 5 | | 104 | 4 | |
select prodid, sum(quantity) as k
from saledetail
group by prodid
其输出为:
+--------+----+
| PRODID | K |
+--------+----+
| 102 | 11 |
| 101 | 5 |
| 104 | 4 |
| 106 | 4 |
| 103 | 2 |
+--------+----+
现在,为了获得具有最小值k的prodid,我必须使用select mink from table_name。但是我没有该查询的表名,因为它是一个子查询。我还试着给它们加上别名,然后我发现了一个错误,无法理解
我想知道如何完成我的要求
如果有更好的解决方案,我们也欢迎
谢谢你Oracle
要获取Oracle中合计最少的产品,请使用FETCH FIRST ROWS:
使用原始查询的替代方法是:
with sums as
(
select prodid, sum(quantity) as sum_quantity
from saledetail
group by prodid
)
select *
from sums
where sum_quantity = (select min(sum_quantity) from sums);
MySQL
此查询为您提供一个数量总和最小的产品:
select prodid, sum(quantity) as sum_quantity
from saledetail
group by prodid
order by sum(quantity)
limit 1;
select prodid, sum(quantity) as sum_quantity
from saledetail
group by prodid
having sum(quantity) =
(
select sum(quantity)
from saledetail
group by prodid
order by sum(quantity)
limit 1
);
然而,并没有限制条款。所以,如果两个或两个以上的产品共享相同的最小总数,上述查询将任意选择其中一个
下面是一个简单的查询,用于获取数量总和最小的所有产品:
select prodid, sum(quantity) as sum_quantity
from saledetail
group by prodid
order by sum(quantity)
limit 1;
select prodid, sum(quantity) as sum_quantity
from saledetail
group by prodid
having sum(quantity) =
(
select sum(quantity)
from saledetail
group by prodid
order by sum(quantity)
limit 1
);
从MySQL 8开始,您可以使用窗口函数只读取表一次:
select prodid, sum_quantity
from
(
select
prodid,
sum(quantity) as sum_quantity,
min(sum(quantity)) over () as min_sum_quantity
from saledetail
group by prodid
) aggregated
where sum_quantity = min_sum_quantity;
Oracle查询和最后一个MySQL查询都是标准SQL。MySQL不支持使用ties获取第一行,因此第一个Oracle查询在MySQL中不起作用。第二个使用WITH子句的方法从MySQL 8开始使用。
为了得到最小值为k的prodid,我必须使用select mink from table_name,简单地按和排序,并获取第一条记录。out输出中的k是什么,而这永远不是第一次查询的out输出。请阅读@abhishek:如果您获得ORA-00936,那么您的DBMS是Oracle,而不是MySQL。这是两个不同的数据库管理系统。哪一个是您的Oracle版本?从v$version;运行选择*;。好的,我已经更新了答案以显示Oracle解决方案。这也是标准SQL中的解决方案,即在这方面对所有符合标准的DBMS都有效。您还可以使用with子句。在您的示例中:sums为select prodid,sumquantity为k from saledetail group by prodid select*from sums,其中k=select mink from sums;,这可能就是你一直在寻找的。我已经在我的回答中添加了这一点。