4

2 つのテーブル:

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固有のものはありますか?

4

4 に答える 4

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句に追加dateCommentPostedし、GROUP BY句に追加すると、それは正しいでしょうか?

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 を除外した方がよい場合もあります。私の知る限り、OracleはASをテーブルエイリアスで完全に拒否します(そのため、そこに残しました)が、選択リストの「列エイリアス」で受け入れます(ただし、必須ではありません)。

ちなみに、SQL 標準、したがって「すべての」SQL DBMS では、HAVING 句で集計比較が必要であり、HAVING 句には GROUP BY 句が必要です。したがって、GBH — Group By / 持つこと、および深刻な身体的危害。

于 2012-04-27T23:07:29.463 に答える
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 での動作をご覧ください。この方法で、各アイテムの最終コメント日付を簡単に返すこともできます。

于 2012-04-27T22:21:13.620 に答える
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
 )
于 2012-04-27T21:57:00.973 に答える
1

おそらく、これはこの特定のクエリに対する最適な解決策ではありませんが、実際の質問のタイトルに基づいて、探しているのはステートメントであり、句HAVINGに集計を入れることができますWHERE

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

于 2012-04-27T21:57:53.727 に答える