两张桌子:
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特定的东西?
使用首选的显式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子句中添加它并添加dateCommentPosted
GROUP 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以及严重的身体伤害.
归档时间: |
|
查看次数: |
26776 次 |
最近记录: |