2012-04-27 3 views
3

두 테이블 : 6 개월 마지막 말 이후Oracle SQL - where 절에서 MAX 기능을 얻으시겠습니까?

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

나는 itemName에 귀하의 의견을받지 못한 품목의 가격이 필요합니다.

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

에 유래에 비슷한 일에 대한 답변이 있지만 오라클은 그것을 좋아되지 않습니다

나는이 작동하지 않습니다 알고있다. 오라클 관련 사항은 무엇입니까?

답변

2

이 시도 :

select i.itemid, i.name, i.price 
    from Item i 
where not exists (
    select 1 
     from ItemComment c 
     where c.dateCommentPosted between (SYSDATE - 180) and SYSDATE 
     and c.itemid = i.itemid 
) 
1

을 아마 실제 질문 제목에 따라이 특정 쿼리에 대한 최적의 솔루션이 아닌,하지만 당신이 찾고있는 것은 당신이 넣을 수있는 HAVING 문이다 WHERE 절 여기

http://psoug.org/reference/group_by.html

3

으로 집계하는 것은 그것을 할 수있는 또 다른 방법의 예 :

with cte as (
    select i.itemid, 
    max(DateCommentPosted) as LastCommentDate 
    from Item i left join ItemComment c on c.itemid = i.itemid 
    group by i.itemid 
) 
select i.itemid, i.ItemName, i.ItemPrice 
from Item i join cte c on c.itemid = i.itemid 
where LastCommentDate is null or LastCommentDate < add_months(SYSDATE,-6) 

sqlfiddle here에서 실제 동작을보십시오. 이 방법으로 각 항목의 최종 코멘트 날짜를 쉽게 반환 할 수도 있습니다.

9

선호 명시 가입 표기법과 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 목록에서 각 항목에 대한 의견이 게시 된 가장 최근 날짜를 계산 한 다음이를 항목 테이블과 조인합니다.

의견이없는 항목을 선택해야하는지 여부를 고려할 수 있습니다.

Max(c.dateCommentPosted)도 표시/선택하고 싶습니다. 그게 선택의 여지가 있니? select 절에 추가하고 GROUP BY 절에 dateCommentPosted을 추가하면 올바른 것입니까?

는 GROUP BY 절을 SELECT 절에 추가 있지만 :

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, 오라클은 테이블 별칭에서 AS를 절대적으로 거부합니다 (그래서 거기에 버렸습니다). 그러나 선택 목록의 '별칭 (column alias)'에서는이를 수용합니다 (요구하지는 않습니다).

덧붙여 말하자면 SQL 표준 및 '모든'SQL DBMS는 HAVING 절에서 집계 비교가 필요하며 HAVING 절은 GROUP BY 절이 필요합니다. 그러므로, GBH — 그룹들에 의해/Gburvous Bodily Harm.

+0

Max (c.dateCommentPosted)도 표시/선택하고 싶습니다. 그게 선택의 여지가 있니? select 절에 추가하고 GROUP BY 절에 dateCommentPosted를 추가하면 올바른 것입니까? – TPR

관련 문제