2016-04-01 20 views
0

Hallo ich möchte die Zeilen meiner Datenbank für einen Paginator in meinem Webprojekt extrahieren.MSSQL get Zeile 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') 

Dies ist meine normale Abfrage, die gut funktioniert. Jetzt mag ich die bestimmten Zeilen zum Beispiel bekommen onyl 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 

Diese Abfrage ist Evry einfach und gibt mir die Zeilen 10 bis 20, aber ich kann es nicht mit meiner Haupt-Abfrage oben kombinieren. Ich habe viele Dinge ausprobiert, kann es aber nicht richtig machen. Ich hoffe, ihr könnt mir helfen.

+4

Welche SQL Server-Version verwenden Sie? –

+0

Die Paginierungstechniken hängen von Ihrer SQL-Version ab, aber die meisten erfordern eine ORDER BY-Klausel. –

+0

Microsoft Entwicklungsstudio 2008 –

Antwort

0

Sie müssen eine Spalte definieren, die Ihre Daten in SQL paging with Row_Number() function

hier verwendet werden können, zum Sortieren eine Probe

;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 

Auf der anderen Seite, SQL Server 2012 wird für Datenbank Order By with Offset and Fetch Next for paging in SQL eingeführt Entwickler

+0

das funktioniert für mich! Danke, aber was bedeutet die erste Zeile des Codes? –

+0

CTE allgemeine Tabelle Ausdruck wird zuerst mit SQL Server 2005 eingeführt. Sie können es als Subselect vorstellen. Der Haupteffekt ist jedoch bei rekursiven Abfragen wichtig. Überprüfen Sie das SQL-Lernprogramm http://www.kodycz.com/t-sql/sql-server-recursive-query-with-recursive-cte.aspx für rekursive Abfragen mit CTE in SQL Server. Die CTE-Syntax erfordert WITH CTE AS() ... und so beginnt es. Und es sollte mit vorherigem Code durch ";" getrennt werden; – Eralper

+0

Vielen Dank! –

0

, wenn Sie mit SQL 2012, Sie Offset und holen können ..

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 
Verwandte Themen