none
SQL row atlamak RRS feed

  • Soru

  • Asp.net query builder da SQL Server databaseimde şunu yapmak istiyorum

    En sondan 6 satırı alsın fakat ilk 1. satırı almasın.

    SELECT        TOP (6) CategoryId, Date, Headline, Id, ImageName, MainPage, Text, Text2
    FROM            Articles
    WHERE        (CategoryId = 2)
    ORDER BY Id DESC

    Bununda son 6 yı alıyorum fakat baştan 1 tanesini nasıl almayacağım? Teşekkürler.

    Örnek

    1 a

    2 b

    3 c

    4 d

    5 e

    6 f

    7 g

    8 h

    9 i

    10 j


    a

    14 Aralık 2015 Pazartesi 12:34

Yanıtlar

  • Verdigin ornekle, sordugun soru biribirini tutmadigindan ne istedigin tam anlasilmiyor.

    Sordugun soruya uyan:

    SELECT TOP 6
            CategoryId, Date, Headline, Id, ImageName, MainPage, Text, Text2
    FROM    Articles
    WHERE   CategoryId = 2 AND
            Id NOT IN ( SELECT TOP 1
                                Id
                        FROM    Articles
                        WHERE   CategoryId = 2 )
    ORDER BY Id DESC;

    Verdigin ornege uyan (SQL Server 2012 ve sonrasi icin):

    SELECT  CategoryId, Date, Headline, Id, ImageName, MainPage, Text, Text2
    FROM    Articles
    WHERE   CategoryId = 2
    ORDER BY Id
            OFFSET 1 ROWS FETCH NEXT 6 ROWS ONLY;

    • Yanıt Olarak İşaretleyen Anıl Ergin 15 Aralık 2015 Salı 11:14
    14 Aralık 2015 Pazartesi 14:05

Tüm Yanıtlar

  • Daha kolayı vardır ama aklıma ilk gelen temp tabloya 7 kayıt alıp oradan ilk kaydı silmek. :)

    Mail Blog Web Site

    14 Aralık 2015 Pazartesi 12:58
  • benim aklıma gelen ROW_NUMBER() yapıp between ile 1 ile 7 arasındakileri almak.

    SELECT ROW_NUMBER() OVER(ORDER BY ID ASC) 
    from tablo where between ID>2 and ID<7
    

    gibi


    kdrgny@outlook.com

    14 Aralık 2015 Pazartesi 13:33
  • Keşke MSSQL sürümünü de yazaydın. 2012 ve üzeri için

    SELECT        TOP (6) CategoryId, Date, Headline, Id, ImageName, MainPage, Text, Text2
    FROM            Articles
    WHERE        (CategoryId = 2)
    ORDER BY Id DESC
    OFFSET 1 ROWS
    FETCH NEXT 6 ROWS ONLY

    yazabilirsin

    14 Aralık 2015 Pazartesi 14:05
  • Verdigin ornekle, sordugun soru biribirini tutmadigindan ne istedigin tam anlasilmiyor.

    Sordugun soruya uyan:

    SELECT TOP 6
            CategoryId, Date, Headline, Id, ImageName, MainPage, Text, Text2
    FROM    Articles
    WHERE   CategoryId = 2 AND
            Id NOT IN ( SELECT TOP 1
                                Id
                        FROM    Articles
                        WHERE   CategoryId = 2 )
    ORDER BY Id DESC;

    Verdigin ornege uyan (SQL Server 2012 ve sonrasi icin):

    SELECT  CategoryId, Date, Headline, Id, ImageName, MainPage, Text, Text2
    FROM    Articles
    WHERE   CategoryId = 2
    ORDER BY Id
            OFFSET 1 ROWS FETCH NEXT 6 ROWS ONLY;

    • Yanıt Olarak İşaretleyen Anıl Ergin 15 Aralık 2015 Salı 11:14
    14 Aralık 2015 Pazartesi 14:05
  • Çetin Bey Merhaba,

    İlk gönderdiğiniz sorguya ufak bir ekleme yaparak sorunu çözdüm. 

    Aslında ikincisi yani OFFSET FETCH kullanmak daha mantıklı. SQL Server 2014 kullanmama rağmen OFFSET kullanamıyorum nedense. Yazdığınızı sorguladım kendim de değiştirdim bazı şeyleri denedim. Ama Offseti çalıştıramadım. 

    Incorrect syntax near 'OFFSET'.
    Invalid usage of the option NEXT in the FETCH statement.

    İlginize teşekkür ederim.

    ELECT TOP 6
            CategoryId, Date, Headline, Id, ImageName, MainPage, Text, Text2
    FROM    Articles
    WHERE   CategoryId = 2 AND
            Id NOT IN ( SELECT TOP 1
                                Id
                        FROM    Articles
                        WHERE   CategoryId = 2 ORDER BY Id DESC )
    ORDER BY Id DESC;


    a

    15 Aralık 2015 Salı 09:43
  • Yani hem soruda hem de ornekte anlattigindan farkli bir sey istiyormussun :)

    Onun icin diyorum, soruyu net sormak, sorarken kod olarak veri verip sonucta ne istedigini acik bir sekilde orneklemek onemli diye. Neyse sonucta cozulmus. 

    Not: Bu arada benim verdigim OFFSET ile, Northwind database Orders tablosu kullanarak senin istedigini modellersek:

    SELECT  *
    FROM    Orders
    WHERE   [ShippedDate] IS NOT NULL
    ORDER BY OrderID DESC
            OFFSET 1 ROWS FETCH NEXT 6 ROWS ONLY;
    Gayet guzel, sondaki 11069'u atliyor ve 11067,11066,11064,11063,11060 ve 11057 OrderId'li kayitlari getiriyor.


    • Düzenleyen CetinBasoz 15 Aralık 2015 Salı 10:04
    15 Aralık 2015 Salı 09:58