2017-01-22 1 views
0

Was könnte die Alternative für lead und lag für SQL Server 2000 bis 2008 sein? Ich versuche, vorherige und nächste Rechnungsnummer angegeben Rechnungsnummer zu bekommen, d.h 5Was sollte die Alternative für Blei und Verzögerung für SQL Server 2000 zu 2008 sein

SqlDataAdapter invoiceAdptr = new SqlDataAdapter(@" 
       select t.prev_invNo, t.InvNo, t.next_invNo 
       from (select 
          lag(InvNo) over (order by id) as prev_invNo, 
          InvNo, 
          lead(InvNo) over (order by id) as next_invNo 
         from Invoice1) t 
       where t.InvNo = " + invoiceNumber + "", con); 

DataTable invoiceDataTable = new DataTable(); 
invoiceAdptr.Fill(invoiceDataTable); 

var invoices = new Invoices() 
{ 
    PreviousInvoice = Convert.ToString(invoiceDataTable.Rows[0]["prev_invNo"]), 
    NextInvoice = Convert.ToString(invoiceDataTable.Rows[0]["next_invNo"]), 
    CurrentInvoice = invoiceNumber 
}; 
+3

Es ist jetzt 2017. Zeit für ein Upgrade? –

Antwort

0

diese arbeitete für mich

"WITH CTE AS(
         SELECT rownum = ROW_NUMBER() OVER(ORDER BY p.InvNo), 
         p.InvNo FROM Invoice1 p 
        ) 
        SELECT 
        prev.InvNo prev_invNo, 
         CTE.InvNo, 
         nex.InvNo next_invNo 
        FROM CTE 
        LEFT JOIN CTE prev ON prev.rownum = CTE.rownum - 1 
        LEFT JOIN CTE nex ON nex.rownum = CTE.rownum + 1 
        where CTE.InvNo = " + invoiceNumber + "" 
+0

Ich empfehle dringend den Ansatz mit 'apply', weil es Indizes besser nutzen kann. –

4

Verwenden outer apply in SQL 2005-2008:

select ilag.InvNo as prev_invNo, 
     InvNo, 
     ilead.InvNo as next_invNo 
from Invoice1 i outer apply 
    (select top 1 i2.* 
     from Invoice1 i2 
     where i2.id < i.id 
     order by id2.id desc 
    ) ilag outer apply 
    (select top 1 i2.* 
     from Invoice1 i2 
     where i2.id > i.id 
     order by id2.id asc 
    ) ilead 
where t.InvNo = " + invoiceNumber + ""; 

Beachten Sie, dass die Unterabfrage nicht mehr benötigt wird. Dies ist jedoch im Allgemeinen viel weniger effizient als die Funktionen lag() und lead().

Verwenden Sie nicht SQL Server 2000. Es wurde seit Jahren nicht unterstützt. (Können Sie ändern die oben Subqueries sein, wenn Sie wirklich nicht unterstützte Software verwenden möchten.)

+3

Herzlichen Glückwunsch zu 500K! Eine wohlverdiente Leistung. Nur neugierig, war da ein Ballon fallen ?. –

+0

danke Gordon Linoff es hat funktioniert –

1

Falls jemand nicht aktualisieren kann ... für SQL Server 2000 Sie Unterabfragen verwenden können:

select 
     InvNo 
    , prev_invNo = (
     select top 1 invNo 
     from invoices p 
     where p.id < i.id 
     order by id desc 
     ) 
    , next_invNo = (
     select top 1 invNo 
     from invoices n 
     where n.id > i.id 
     order by id asc 
     ) 
    from Invoice1 as i 
Verwandte Themen