2016-04-01 253 views
0

こんにちは私は私のウェブプロジェクトのページャーのために私のデータベースの行を抽出したいと思います。MSSQL get row 10 - 20

SELECT DISTINCT jtg.JobID, jtg.CreatedOn, ksnr.value as Snr, kkz.value 
as Kennz, kvu.value as Vu, kstr.value as Strecke, kkzvn.value as KennzVN, ttr.jobid1 as messageId 
FROM tbl_one jtg 
LEFT JOIN tbl_two ksnr on jtg.jobid=ksnr.jobid and ksnr.keyid=6 
LEFT JOIN tbl_two kkz on jtg.jobid=kkz.jobid and kkz.keyid=29 
LEFT JOIN tbl_two kvu on jtg.jobid=kvu.jobid and kvu.keyid=15 
LEFT JOIN tbl_two kstr on jtg.jobid=kstr.jobid and kstr.keyid=24 
LEFT JOIN tbl_two kkzvn on jtg.jobid=kkzvn.jobid and kkzvn.keyid=30 
LEFT JOIN tbl_three ttr on jtg.jobid=ttr.jobid2 
WHERE jtg.JobID IN (SELECT words.JobId FROM tbl_four words LEFT JOIN tbl_five keys on words.KeyID = keys.KeyID WHERE keys.Name = 'Schadennummer') 

これは正常に動作する通常のクエリです。今私は、例えば10特定の行ニル取得したい - 20

select * from (select row_number() over(order by jtg.jobid) num,* from 
tbl_Job_Tracking_Generator jtg) a 
where num > 10 and num < 21 

このクエリはエブリー簡単で、私にライン10-20を与えますが、私は上記の私のメインクエリとそれを組み合わせる傾けます。 Iveは多くのことを試しましたが、それは正しいものです。あなたたちが私を助けてくれることを願っています。あなたがここSQL paging with Row_Number() function

でデータをソートするために使用することができ、列を定義する必要があり

+4

どのSQL Serverのバージョンを使用していますか? –

+0

ページ区切りのテクニックはSQLのバージョンによって異なりますが、ほとんどの場合は 'ORDER BY'節が必要です。 –

+0

マイクロソフト開発スタジオ2008 –

答えて

0

が一方

;with cte as (
SELECT 
    DISTINCT 
    ROW_NUMBER() Over (Order By jtg.JobID Desc) rn, 
    jtg.JobID, 
    jtg.CreatedOn, 
    ksnr.value as Snr, 
    kkz.value as Kennz, 
    kvu.value as Vu, 
    kstr.value as Strecke, 
    kkzvn.value as KennzVN, 
    ttr.jobid1 as messageId 
FROM tbl_one jtg 
LEFT JOIN tbl_two ksnr on jtg.jobid=ksnr.jobid and ksnr.keyid=6 
LEFT JOIN tbl_two kkz on jtg.jobid=kkz.jobid and kkz.keyid=29 
LEFT JOIN tbl_two kvu on jtg.jobid=kvu.jobid and kvu.keyid=15 
LEFT JOIN tbl_two kstr on jtg.jobid=kstr.jobid and kstr.keyid=24 
LEFT JOIN tbl_two kkzvn on jtg.jobid=kkzvn.jobid and kkzvn.keyid=30 
LEFT JOIN tbl_three ttr on jtg.jobid=ttr.jobid2 
WHERE 
    jtg.JobID IN (
     SELECT words.JobId 
     FROM tbl_four words 
     LEFT JOIN tbl_five keys on words.KeyID = keys.KeyID 
     WHERE keys.Name = 'Schadennummer' 
    ) 
) 
select * from cte where rn between 11 and 20 

サンプルでは、​​SQL Server 2012は、データベースのSQLにOrder By with Offset and Fetch Next for pagingを導入しています開発者

+0

これは私のために働く!ありがとうございますが、最初のコード行はどういう意味ですか? –

+0

CTEの共通テーブル式は、SQL Server 2005で最初に導入されました。サブセレクトと考えることができます。しかし、その主な効果は、再帰的なクエリの重要性です。 SQLチュートリアルhttp://www.kodyaz.com/t-sql/sql-server-recursive-query-with-recursive-cte.aspxで、SQL ServerでCTEを使用した再帰的クエリを確認してください。 CTEの構文にはWITH CTE AS()が必要です。このように開始します。そしてそれは前のコードと ";"で区切られていなければなりません。 – Eralper

+0

ありがとうございました! –

0

あなたは、SQL 2012を使用している場合、あなたはオフセットを使用して取得することができます。..

with 
cte 
as 
(
SELECT DISTINCT jtg.JobID, jtg.CreatedOn, ksnr.value as Snr, kkz.value 
as Kennz, kvu.value as Vu, kstr.value as Strecke, kkzvn.value as KennzVN, ttr.jobid1 as messageId 
FROM tbl_one jtg 
LEFT JOIN tbl_two ksnr on jtg.jobid=ksnr.jobid and ksnr.keyid=6 
LEFT JOIN tbl_two kkz on jtg.jobid=kkz.jobid and kkz.keyid=29 
LEFT JOIN tbl_two kvu on jtg.jobid=kvu.jobid and kvu.keyid=15 
LEFT JOIN tbl_two kstr on jtg.jobid=kstr.jobid and kstr.keyid=24 
LEFT JOIN tbl_two kkzvn on jtg.jobid=kkzvn.jobid and kkzvn.keyid=30 
LEFT JOIN tbl_three ttr on jtg.jobid=ttr.jobid2 
WHERE jtg.JobID IN (SELECT words.JobId FROM tbl_four words LEFT JOIN tbl_five keys on words.KeyID = keys.KeyID WHERE keys.Name = 'Schadennummer') 
) 
select * from 
cte 
order by jobid,createdon,value--idea here is to make this order by unique 
offset 10 rows fetch next 10 rows only