2017-10-21 90 views
0

J'ai deux tables SQL, nouvelles et sections de nouvelles. Je souhaite afficher les premières lignes d'un groupe en sélectionnant 4 types différents de sections d'actualités. Par exemple:comment sélectionner la première ligne du groupe par avec la jointure

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

Les échantillons de données et les résultats souhaités expliqueraient mieux ce que vous voulez faire. J'ai ajouté la balise SQL Server. –

+1

Quel est le problème avec la requête en cours? – Parfait

+0

Il y a une chose que je ne comprends pas à propos de votre modèle de données. Vous avez des nouvelles et des sections de nouvelles. Donc je m'attendrais à ce que les deux tables soient reliées par l'ID de nouvelles. Mais étonnamment, vous vous joignez à sectionID. Comment une nouvelle peut-elle avoir un sectionID? Cela ne ferait-il pas de la section des nouvelles une nouvelle? Ou est-ce une faute de frappe simple dans votre requête? –

Répondre

0

Vous pouvez utiliser APPLY:

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

J'ai essayé, mais j'ai reçu le message suivant: Msg 156, niveau 15, état 1, ligne 8 Syntaxe incorrecte près du mot clé 'ON'. – splitfire

+0

@splitfire. . . C'était une faute de frappe. Il n'y a pas de "ON" avec "APPLY". –

0

À partir de votre requête, vous allez les 4 articles les plus récents de toutes les sections de nouvelles mises en commun - sens, vous pouvez obtenir plusieurs articles d'une seule section et aucun article d'une autre section s'il y a eu une activité plus récente dans certaines sections par rapport à d'autres.

Je suppose que ce que vous voulez réellement est l'article le plus récent de CHACUNE des sections. Si oui, alors la réponse de Gordon Linoff ferait l'affaire - sauf qu'il est parti dans la clause 'ON' dans la requête. (Gordon lui-même l'a souligné.) Cela devrait ressembler plus à ceci:

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

Je reçois la même erreur. J'utilise SQL Server 2008. La requête semble bonne, mais me donne toujours cette erreur .. – splitfire