【问题标题】:Selecting minimum value, getting Invalid relational operator选择最小值,得到无效的关系运算符
【发布时间】:2015-03-12 01:25:29
【问题描述】:

我在使用基本 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 只会给我留下一个最小的订单,为什么会出错?

更新

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

【问题讨论】:

  • 别忘了 GROUP BY!
  • 错误是由两件事引起的,第一min(sale_price)不是条件,应该是sale_price = min(sale_price),第二你需要一个group by。

标签: sql oracle oracle11g


【解决方案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)

【讨论】:

    【解决方案2】:

    您可以使用分析(窗口)函数而不是聚合来做到这一点:

    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()

    【讨论】:

      猜你喜欢
      • 2012-11-15
      • 2014-09-17
      • 2018-08-07
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 2020-11-19
      • 2020-02-07
      相关资源
      最近更新 更多