2015-04-27 14 views
7

Ich möchte eine Abfrage "SELECT * FROM TABLE" auslösen, sondern nur aus Zeile N+1 auswählen. Irgendeine Idee, wie man das macht?Wie überspringe ich die ersten n Zeilen in SQL-Abfrage

+4

helfen, die rdbms werden Sie mit (f.e. Oracle, MySQL oder SQL-Server)? –

+6

Welche DBMS? "OFFSET n" ist ANSI SQL, aber viele dbms-Produkte tun dies auf ihre eigene Weise, z. LIMIT, TOP ... – jarlh

+1

Wenn Sie Zeilen in einem bestimmten Zeilennummernbereich finden möchten, können Sie auch Funktionen wie ['ROW_NUMBER'] (https://msdn.microsoft.com/en-us/library/ms186734 verwenden .aspx). Aber das hängt wirklich von Ihrem dbms ab. –

Antwort

4

Abfrage: in

declare @N int= 5 --Any random number 

SELECT * FROM (
     SELECT ROW_NUMBER()OVER(ORDER BY ID)AS ID 
       ,ID 
     FROM TABLE_NAME 
)AS tbl 
WHERE ID >= @N + 1 
ORDER BY tbl.ID 

Dies wird Zeilen der Tabelle geben, wo ID aus @N + 1 starten.

+9

Ich stimme dieser Antwort nicht zu, das funktioniert nicht so, wie Sie es möchten. Mit dieser Lösung überspringen Sie nicht die N Zeilen, setzen Sie die N Zeilen mit ID> = N –

+0

Hinweis * Diese Antwort funktioniert nur, wenn Ihre ID in sequenzieller Reihenfolge ist und Sie nie eine Zeile aus dieser Tabelle gelöscht haben. –

11

SQL Server:

select * from table 
except 
select top N * from table 

Oracle:

select * from table 
minus 
select * from table where rownum <= N 

with TableWithNum as (
    select t.*, rownum as Num 
    from Table t 
) 
select * from TableWithNum where Num > N 

Sie können Ihren Bedarf mehr oder weniger erfüllen.

Es gibt keine direkte Möglichkeit, was Sie mit SQL machen möchten. Allerdings ist es meiner Meinung nach kein Designfehler.

SQL soll nicht so verwendet werden.

In relationalen Datenbanken stellt eine Tabelle eine Beziehung dar, die per Definition definiert ist. Ein Satz enthält ungeordnete Elemente.

Auch verlassen Sie sich nicht auf die physische Reihenfolge der Datensätze. Die Reihenfolge der Zeilen wird vom RDBMS nicht garantiert.

Wenn die Reihenfolge der Datensätze wichtig ist, fügen Sie der Tabelle eine Spalte wie "Num" hinzu und verwenden Sie die folgende Abfrage. Dies ist natürlicher.

select * 
from Table 
where Num > N 
order by Num 
+1

ANSI SQL: "Wählen Sie * aus Tabellenname OFFSET n", und auch in diesem Fall wird ORDER BY empfohlen. – jarlh

+1

(a) Ja, gute Antwort. Siehe meinen Kommentar zu der Frage. (b) In Ihrem letzten Satz brauchen Sie nicht unbedingt * eine * Spalte hinzuzufügen, nur 'ORDER BY ...' welche Spalte auch immer benötigt wird, um das gewünschte Ergebnis zu erhalten. (c) Aktiviere die ORDER BY.' – PerformanceDBA

2

Was:

SELECT * FROM table LIMIT 50 OFFSET 1 
+3

Beachten Sie, dass dies nicht in allen Varianten von SQL funktioniert, da die Schlüsselwörter 'LIMIT' und 'OFFSET' nicht Teil des ANSI-Standards sind (siehe [diese Frage] (http://stackoverflow.com/q/1528604/ 168775)). – eykanal

4

Wollen Sie wie etwas in LINQ 5 überspringen und 10 nehmen?

SELECT TOP(10) * 
FROM MY_TABLE 
WHERE ID not in (SELECT TOP(5) ID From My_TABLE); 
21

verwenden:

SELECT * 
FROM Sales.SalesOrderHeader 
ORDER BY OrderDate 
OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY 

https://stackoverflow.com/a/19669165/1883345

+0

Hinweis: diese Abfrage funktioniert nur für SQL Server 2012 und höher –

-2

Für SQL2012 und späteren Versionen ist die beste Methode @ MajidBasirati Antwort.

Ich liebte auch @ CarlosToledo die Antwort, es ist nicht auf eine SQL Server-Version beschränkt, aber es fehlt Order By Klauses. Ohne sie kann es falsche Ergebnisse zurückgeben.

Für SQL 2008 und später würde ich Common Table Expressions für bessere Leistung verwenden.

-- This example omits first 10 records and select next 5 records 
;WITH MyCTE(Id) as 
(
    SELECT TOP (10) Id 
    FROM MY_TABLE 
    ORDER BY Id 
) 
SELECT TOP (5) * 
FROM MY_TABLE 
    INNER JOIN MyCTE ON (MyCTE.Id <> MY_TABLE.Id) 
ORDER BY Id 
4

Um dies in SQL Server zu tun, müssen Sie die Abfrage nach einer Spalte bestellen, damit Sie die gewünschten Zeilen angeben können.

Beispiel:

select * from table order by [some_column] 
offset 10 rows 
FETCH NEXT 10 rows only 
1

Dies mit allen DBRM/SQL arbeitet, ist es Standard ANSI:

SELECT * 
    FROM owner.tablename A 
WHERE condition 
    AND n+1 <= (
     SELECT COUNT(DISTINCT b.column_order) 
      FROM owner.tablename B 
      WHERE condition 
      AND b.column_order>a.column_order 
     ) 
ORDER BY a.column_order DESC 
+0

Die obige codierte Anweisung select überspringt die ersten n Zeilen mit größerem Wert in column_order. Sie können die Bedingung so ändern, dass sie wie gewünscht kleiner abgerufen wird. – fspino

1

Ich weiß, es ist ziemlich spät, um jetzt die Anfrage zu beantworten. Aber ich habe eine etwas andere Lösung als die anderen, von denen ich glaube, dass sie eine bessere Leistung hat, da keine Vergleiche in der SQL-Abfrage durchgeführt werden, sondern nur sortiert wird. Sie können seine erhebliche Leistungsverbesserung im Grunde sehen, wenn der Wert von SKIP groß genug ist.

  1. Beste Leistung aber nur für SQL Server 2012 und höher. Original von @Majid Basirati's answer das ist wieder erwähnenswert.

    DECLARE @Skip INT = 2, @Take INT = 2 
    
    SELECT * FROM TABLE_NAME 
    ORDER BY ID ASC 
    OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY 
    
  2. nicht so gut wie die erste, aber kompatibel mit SQL Server 2005 und höher.

    DECLARE @Skip INT = 2, @Take INT = 2 
    
    SELECT * FROM 
    (
        SELECT TOP (@Take) * FROM 
        (
         SELECT TOP (@Take + @Skip) * FROM TABLE_NAME 
         ORDER BY ID ASC 
        ) T1 
        ORDER BY ID DESC 
    ) T2 
    ORDER BY ID ASC 
    
0

In FairCom SQL (das ist ein Pseudo-MySQL ist), kann ich dies tun, in einer super einfachen SQL-Anweisung, wie folgt:

SELECT SKIP 10 * FROM TABLE ORDER BY Id 

Offensichtlich kann man nur 10 ersetzen jede deklarierte Variable Ihres Wunsches.

Ich habe keinen Zugang zu MS SQL oder anderen Plattformen, aber ich bin wirklich überrascht, dass MS SQL so etwas nicht unterstützt.

0

versuchen unter Abfrage ist es Arbeit

SELECT * FROM `my_table` WHERE id != (SELECT id From my_table LIMIT 1) 

Hope this

Verwandte Themen