【问题标题】:SQL constraints in WHERE clause?WHERE 子句中的 SQL 约束?
【发布时间】:2017-05-08 20:48:11
【问题描述】:

我想选择报价中至少包含三种产品且价格在 5 到 20 之间的所有商店,我需要显示商店 ID 和名称以及满足条件的产品数量。这是代码:

SELECT SHOP.SHOP_ID, SHOP.SHOP_NAME, COUNT(PRODUCT.PRODUCT_ID) AS NUM
FROM SHOP JOIN PRODUCT USING (SHOP_ID)
GROUP BY SHOP_ID
HAVING (SELECT SHOP_ID FROM PRODUCT WHERE COST IS BETWEEN 5 AND 20 AND NUM>=3)

我遇到的问题是 NUM>3 的约束正在起作用,但结果我得到了价格低于 5 和超过 20 的产品。这就像 BETWEEN 没有任何部分,我不明白为什么那个。

【问题讨论】:

    标签: sql group-by having


    【解决方案1】:

    在聚合之前对价格进行过滤:

    SELECT SHOP_ID, s.SHOP_NAME, COUNT(*) AS NUM
    FROM SHOP s JOIN
         PRODUCT p
         USING (SHOP_ID)
    WHERE p.COST BETWEEN 5 AND 20
    GROUP BY SHOP_ID, SHOP_NAME
    HAVING COUNT(*) >= 3;
    

    大多数(但不是全部)数据库还允许您编写 HAVING NUM > 3。同样,将所有未聚合的列包含在 GROUP BY 中是一个很好的做法——除非您真的、真的知道自己在做什么。

    【讨论】:

    • 什么 rdbms IS BETWEEN 来自?
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多