2012-04-27 18 views
3

2つのテーブル:Oracle SQL - where句でMAX機能を実現しますか?

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

私はitemNameにして以来、任意のコメントを受けていないアイテムの価格は最後の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固有のものはどれですか?

答えて

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

好適明示的な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テーブルと結合します。

コメントのない項目を選択する必要があるかどうかを検討したい場合があります。

Max(c.dateCommentPosted)も表示/選択したい場合はどうすればいいですか?それはオプションですか?それをselect節に追加し、GROUP BY句にdateCommentPostedを追加すると、それは正しいでしょうか?

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を絶対に拒否します(私はそこに残しました)が、select-listの 'カラムエイリアス'でそれを受け入れますが、必要はありません。

なお、SQL標準、したがって「すべての」SQL DBMSでは、HAVING句で集約比較が必要であり、HAVING句にはGROUP BY句が必要です。したがって、GBH —グループ化することによって/同様に有害な体の害を持つ。

+0

Max(c.dateCommentPosted)も表示/選択したい場合はどうすればいいですか?それはオプションですか?それをselect節に追加し、GROUP BY節にdateCommentPostedを追加すると、それは正しいでしょうか? – TPR