选择最小值,获取无效的关系运算符

时间:2015-03-11 15:36:46

标签: sql oracle oracle11g

我遇到基本SQL查询的问题。将MIN函数与连接一起使用时会发生这种情况。

我要做的是选择订单最少的客户,同时显示详细信息。

出现的错误是以下函数中的无效运算符:

SELECT CUSTOMER.FNAME, CUST_ORDER.SALE_PRICE FROM (CUSTOMER INNER JOIN CUST_ORDER ON CUST_ORDER.CUST_NBR=CUSTOMER.CUST_NBR)HAVING MIN(CUST_ORDER.SALE_PRICE);

+----------+-------+-------+
| CUST_NBR | FNAME | LNAME |
+----------+-------+-------+
+-----------+----------+------------+
| ORDER_NUM | CUST_NUM | SALE_PRICE |
+-----------+----------+------------+

我要找的结果是:

+-------+------------+
| FNAME | SALE_PRICE |
+-------+------------+

哪个应该只返回单个用户,其名称为销售价格。

我也试过

HAVING SALE_PRICE = MIN(SALE_PRICE)

但是这会错误地抛出一组。我也尝试了一个group by子句:

SELECT CUSTOMER.FNAME, CUST_ORDER.SALE_PRICE FROM (CUSTOMER INNER JOIN CUST_ORDER ON CUST_ORDER.CUST_NBR=CUSTOMER.CUST_NBR) GROUP BY FNAME HAVING MIN(CUST_ORDER.SALE_PRICE);

也给出了无效的操作错误。

有谁可以指出我做错了什么?

注意

如果我从原始查询中取出HAVING min(sale_price),它将返回所有用户和所有订单的列表。我假设有min会给我留下一个最小的顺序,为什么它会出错?

更新

我已经包含了评论建议的解决方案,但这会返回每个用户的最小订单,我希望所有用户中的最小订单只能返回一个客户。

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

SELECT CUSTOMER.FNAME, CUST_ORDER.SALE_PRICE
  FROM (SELECT CUSTOMER.FNAME,
               CUST_ORDER.SALE_PRICE,
               MIN (CUST_ORDER.SALE_PRICE) OVER () MIN_PRICE
          FROM (CUSTOMER
                INNER JOIN CUST_ORDER
                   ON CUST_ORDER.CUST_NBR = CUSTOMER.CUST_NBR))
 WHERE CUST_ORDER.SALE_PRICE = MIN_PRICE

此外,您可以使用子查询获得最小值,然后请求它:

 SELECT CUSTOMER.FNAME, CUST_ORDER.SALE_PRICE
    FROM (CUSTOMER
          INNER JOIN CUST_ORDER ON CUST_ORDER.CUST_NBR = CUSTOMER.CUST_NBR)
    where CUST_ORDER.SALE_PRICE = (SELECT MIN(SALE_PRICE) FROM CUST_ORDER)

答案 1 :(得分:0)

您可以使用分析(窗口)函数而不是聚合来执行此操作:

SELECT fname, sale_price FROM (
    SELECT c.fname, co.sale_price, RANK() OVER ( ORDER BY co.sale_price ) rn
      FROM customer c INNER JOIN cust_order co
        ON c.cust_nbr = co.cust_nbr
) WHERE rn = 1;

这将以最低订单销售价格返回所有客户;如果您只想要一个最小的客户,请使用ROW_NUMBER()代替RANK()