0

私の問題への答えはランキングと関係があることを私は知っています、ただ正確に何をすべきかわからないだけです。私のステートメントの目標は、5つのレコードのみを取得することですが、特定のテーブルのレコードを別のテーブルよりも優先することです。

私は2つのテーブルを持っています:NewsNewsToLocation

ニューステーブルに4つのニュース項目があり、NewsToLocation私の要件を満たす3つのニュース項目があるとしましょう。News5つしか選択できないので、テーブルの4つが優先されることを確認してから、NewsToLocationテーブルから1つだけを選択します。私の現在のクエリは反対のことをしていて、それを修正する方法を理解できません。

これがクエリ全体です。

SELECT 
newSpotlights.* 
FROM
(SELECT 
    TOP 5 n.news_id, 
    n.is_spotlight, 
    n.location_id, 
    n.news_title, 
    CAST(n.news_content AS varchar(200)) AS news_content, 
    n.writing_date,
    n.publication_date, 
    n.end_date, 
    n.alt_uri, 
    n.youtube_code, 
    n.icon_img_file, 
    n.banner_img_file
FROM 
    (SELECT 
        n.news_id
    FROM rcde_news n
    WHERE n.location_id = 4
    AND n.is_spotlight = 1 AND n.publication_date < GETDATE() AND n.end_date > GETDATE()
    AND n.status_id = 2 /*2 = Active rcde_ItemStatus*/
    UNION
    SELECT 
        n.news_id
    FROM rcde_newsToLocation ntl
    INNER JOIN rcde_news n ON ntl.news_id = n.news_id
    WHERE ntl.location_id = 4
    AND n.status_id = 2 /*2 = Active rcde_ItemStatus*/ 
    ) AS News
INNER JOIN rcde_news n ON news.news_id = n.news_id
WHERE n.is_spotlight = 1
AND n.publication_date < GETDATE()
AND n.end_date > GETDATE()
ORDER BY publication_date DESC
) AS newSpotlights

最も内側のクエリにランク付けすることで、ある程度の順序付けができるはずだと思いますが、正確に何をすべきかわかりません。私はランキングをある程度理解していますが、UNIONステートメントでそれをどのように行うかについての手がかりはありません。ユニオンのさまざまな部分でそれぞれランクとして1を選択し、ランクとして2を選択してから、ランク順に並べ替えるだけの簡単なことを実行できますか?

4

3 に答える 3

1

その1をランクとして、2をランクとしてクエリの和集合部分に追加し、最初にそれで並べ替えることができます。

SELECT 
    TOP 5 
    n.news_id, 
    n.is_spotlight, 
    n.location_id, 
    n.news_title, 
    CAST(n.news_content AS varchar(200)) AS news_content, 
    n.writing_date,
    n.publication_date, 
    n.end_date, 
    n.alt_uri, 
    n.youtube_code, 
    n.icon_img_file, 
    n.banner_img_file
FROM 
    (SELECT 
        1 as rank,
        n.news_id
    FROM rcde_news n
    WHERE n.location_id = 4
    AND n.is_spotlight = 1 AND n.publication_date < GETDATE() AND n.end_date > GETDATE()
    AND n.status_id = 2 /*2 = Active rcde_ItemStatus*/
    UNION
    SELECT 
        2 as rank,
        n.news_id
    FROM rcde_newsToLocation ntl
    INNER JOIN rcde_news n ON ntl.news_id = n.news_id
    WHERE ntl.location_id = 4
    AND n.status_id = 2 /*2 = Active rcde_ItemStatus*/ 
    ) AS News
INNER JOIN rcde_news n ON news.news_id = n.news_id
WHERE n.is_spotlight = 1
AND n.publication_date < GETDATE()
AND n.end_date > GETDATE()
ORDER BY rank DESC, publication_date DESC
于 2012-08-29T14:54:49.067 に答える
0

はい、あなたは基本的にあなたのランクのアイデアでそれを持っています:

select top 5 Column1, Column2
from (
    select top 5 Column1, Column2, 1 as Rank
    from News
    order by SomeColumn

    union all

    select top 5 Column1, Column2, 2 as Rank
    from NewsLocation
    order by SomeColumn
    ) x
order by Rank
于 2012-08-29T14:54:08.943 に答える
0
SELECT
    TOP 5 
    n.news_id
FROM 
    (SELECT 
        1 as ranking,
        n.news_id
    FROM rcde_news n
    WHERE blah blah
    UNION
    SELECT 
        2 as ranking,
        n.news_id
    FROM rcde_newsToLocation ntl
    WHERE blah blah

    ) AS News
ORDER BY publication_date DESC, Ranking
于 2012-08-29T14:54:23.810 に答える