2017-10-21 10 views
0

私は2つのSQLテーブル、ニュース、ニュースセクションを持っています。私は、4つの異なるタイプのニュースセクションを選択するときに、グループから最上位の行を表示したい。あなたがAPPLY使用することができますグループでトップローを選択する方法

SELECT TOP (4) a.newsID, a.title, a.clicked, a.path, a.newsDate, c.sectionName, a.sectionID 
FROM dbo.News a INNER JOIN 
    dbo.newsSection c 
    ON a.sectionID = c.SectionID 
WHERE (c.SectionID = 21) OR (c.SectionID = 23) OR (c.SectionID = 36) OR (c.SectionID = 37) 
GROUP BY c.sectionName, a.newsID, a.title, a.clicked, a.path, a.newsDate, a.sectionID 
ORDER BY a.newsDate DESC 
+1

サンプルデータと望ましい結果は、あなたがしたいことをよりよく説明します。 SQL Serverタグを追加しました。 –

+1

現在のクエリで何が問題になっていますか? – Parfait

+0

データモデルについて私が理解していないことが1つあります。あなたはニュースとニュースセクションを持っています。だから私は2つのテーブルがニュースIDによって関連していると期待します。しかし、意外にも、あなたはsectionIDで参加します。ニュースにはどのようにsectionIDがありますか?ニュースをニュースセクションにするのではないでしょうか?それとも、これはあなたのクエリの単純なタイプミスですか? –

答えて

0

:たとえば - 、意味をクエリから

SELECT n.*, ns.sectionName 
FROM dbo.newsSection ns CROSS APPLY 
    (SELECT TOP 1 n.* 
     FROM dbo.News n 
     WHERE n.sectionID = ns.sectionID 
     ORDER BY n.newsDate DESC 
    ) n 
WHERE ns.SectionID IN (21, 23, 36, 37); 
+0

私はそれを試みましたが、このメッセージを受け取りました:メッセージ156、レベル15、状態1、行8 キーワード 'ON'の近くに構文が正しくありません。 @ splitfire。 – splitfire

+0

。 。それはタイプミスでした。 APPLYには「ON」はありません。 –

0

を、あなたはニュースセクションのすべてから4つの最新の記事は、一緒にプールに行っています単一のセクションから複数の記事を取得したり、一部のセクションでより最近の活動があった場合は別のセクションからの記事を取得したりすることはできません。

あなたが実際に望んでいるのは、各セクションの最新の記事です。もしそうなら、ゴードン・リノフの返事はそのトリックを行いますが、彼はクエリーの 'ON'句に入れました。 (Gordon氏自身がこれを指摘しています)このようになるべきである:

SELECT n.*, ns.sectionName 
FROM dbo.newsSection ns CROSS APPLY 
    (SELECT TOP 1 n.* 
     FROM dbo.News n 
     WHERE n.sectionID = ns.sectionID 
     ORDER BY n.newsDate DESC 
    ) n 
WHERE ns.SectionID IN (21, 23, 36, 37); 
+0

同じエラーが発生しています。私はSQL Server 2008を使用しています。クエリはよく見えますが、それでも私にはエラーが出ます。 – splitfire

関連する問題