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

TPR*_*TPR 4 sql oracle

两张桌子:

ItemComment(ItemId, ItemComment, DateCommentPosted)
Item (ItemId, ItemName, ItemPrice) 
Run Code Online (Sandbox Code Playgroud)

我需要自去年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));
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*ler 9

使用首选的显式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));
Run Code Online (Sandbox Code Playgroud)

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

您可能想要考虑是否应该选择没有任何注释的项目.

如果我想显示/选择Max(c.dateCommentPosted)了.这是一个选择吗?如果我在select子句中添加它并添加dateCommentPostedGROUP BY子句,那会是正确的吗?

将它添加到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));
Run Code Online (Sandbox Code Playgroud)

您可能更愿意离开AS.AFAIK,Oracle绝对拒绝表别名中的AS(所以我把它留在那里),但它接受(但不要求)它在select-list中的'column aliases'中.

顺便提一下,SQL标准,因此"所有"SQL DBMS,需要在HAVING子句中进行聚合比较,而HAVING子句需要GROUP BY子句.因此,GBH - Group By/Having以及严重的身体伤害.