gpt4 book ai didi

sql - Oracle SQL - 在 where 子句中实现 MAX 功能?

转载 作者:行者123 更新时间:2023-12-04 15:56:23 25 4
gpt4 key购买 nike

两张表:

ItemComment(ItemId, ItemComment, DateCommentPosted)
Item (ItemId, ItemName, ItemPrice)

我需要自过去 6 个月以来未收到任何评论的商品的商品名称和价格。

我知道这行不通:
SELECT i.itemid, i.name, i.price 
FROM Item i, ItemComment c
WHERE i.itemid = c.itemid
AND Max(c.dateCommentPosted) < (add_months(SYSDATE,-6));

StackOverflow 上有类似的答案,但 Oracle 不喜欢它。任何特定于 Oracle 的东西?

最佳答案

使用首选的显式 JOIN 表示法以及 GROUP BY 和 HAVING 子句,您应该能够使用:

SELECT i.itemid, i.name, i.price 
FROM Item i
JOIN ItemComment c ON i.itemid = c.itemid
GROUP BY i.itemid, i.name, i.price
HAVING MAX(c.dateCommentPosted) < (ADD_MONTHS(SYSDATE, -6));

您还可以使用 WITH 子句或直接在 FROM 列表中编写子查询,以计算为每个项目发布评论的最近日期,然后将其与 Item 表连接。

您可能需要考虑是否应选择没有任何评论的项目。

What if I want to show/select Max(c.dateCommentPosted) too. Is that an option? If I add that in the select clause and add dateCommentPosted in the GROUP BY clause, would that be correct?



将其添加到 select 子句中,而不是 GROUP BY 子句中:
SELECT i.itemid, i.name, i.price, MAX(c.dateCommentPosted) AS dateCommentPosted
FROM Item i
JOIN ItemComment c ON i.itemid = c.itemid
GROUP BY i.itemid, i.name, i.price
HAVING MAX(c.dateCommentPosted) < (ADD_MONTHS(SYSDATE, -6));

您可能更愿意将 AS 排除在外。 AFAIK,Oracle 绝对拒绝表别名中的 AS(所以我把它留在了那里),但它在选择列表的“列别名”中接受(但不需要)它。

顺便提一下,SQL 标准以及“所有”SQL DBMS 需要在 HAVING 子句中进行聚合比较,而 HAVING 子句需要一个 GROUP BY 子句。因此,GBH — 分组依据/拥有以及严重的 body 伤害。

关于sql - Oracle SQL - 在 where 子句中实现 MAX 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10358318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com