Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从SQL中的子查询中获取具有最小值的行?_Sql_Oracle_Oracle12c - Fatal编程技术网

如何从SQL中的子查询中获取具有最小值的行?

如何从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 | |

我有一个表Saledetail,其中包含prodid和Quantity列。我想从该表中获取数量总和最小的prodid

在经历了以下资源之后:

我写了这个查询

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;,这可能就是你一直在寻找的。我已经在我的回答中添加了这一点。