2017-05-01 3 views
1

Mit einer Abfrage, die zu Ergebnissen von über 500 KB führt. Was ich tun möchte, ist diese durch 100K Ergebnisse zu teilen. Ich habe Spalte eine Zeilennummer mit dem helfen, aber jetzt, dass ich Referenzierung es in meinem WHERE es nicht die Funktion verarbeitet und hält diese Fehler:Verweis auf ROW_NUMBER() in WHERE

Msg 4108, Ebene 15, Status 1, Zeile 1 Fensterfunktionen können nur in den SELECT- oder ORDER BY-Klauseln angezeigt werden.

Abfrage Referenz:

1 SELECT 
2 mt.Name, 
3 mt.IDNO, 
4 so.IDType, 
5 Row = ROW_NUMBER()OVER(ORDER BY mt.Name) 
6 
7 FROM   MainTable  mt WITH(NOLOCK) 
8 LEFT JOIN SupportTable1 so WITH(NOLOCK) ON so.Name = mt.Name 
9 LEFT JOIN SupportTable2 st WITH(NOLOCK) ON st.Name = mt.Name 
10 
11 WHERE 1=1 
12 AND  ROW_NUMBER()OVER(ORDER BY mt.Name) BETWEEN '1' and '100000' 
Msg 4108, Level 15, State 1, Line 12 Windowed functions can only 
appear in the SELECT or ORDER BY clauses. 

Was kann ich tun dies entweder verwenden oder gibt es eine andere Möglichkeit, das zu erforschen kann mir geben, was ich brauche?

Danke.

+1

Sie verwenden nicht MySQL. Der Code ist offensichtlich SQL Server. –

+0

Sie können diesen Artikel lesen, bevor Sie weiterhin alle Ihre Abfragen mit NOLOCK-Hinweisen bestreuen. http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

Antwort

3

Sie verwenden nicht MySQL. Um dies zu tun, verwenden Sie einen CTE oder Unterabfrage:

SELECT s.* 
FROM (SELECT mt.Name, mt.IDNO, so.IDType, Row = ROW_NUMBER() OVER (ORDER BY mt.Name) 
     FROM MainTable mt LEFT JOIN 
      SupportTable1 so 
      ON so.Name = mt.Name LEFT JOIN 
      SupportTable2 st 
      ON st.Name = mt.Name 
    ) s 
WHERE Row BETWEEN 1 and 100000; 

Hinweise:

  • Fensterfunktionen können nicht in der WHERE Klausel verwendet werden.
  • Spaltenaliasnamen können nicht in der WHERE-Klausel verwendet werden; Aus diesem Grund wird ein CTE oder eine Unterabfrage benötigt.
  • Setzen Sie keine einfachen Anführungszeichen um ganzzahlige Konstanten.

Alternativ können Sie nur TOP verwenden:

 SELECT TOP (100000) mt.Name, mt.IDNO, so.IDType, Row = ROW_NUMBER() OVER (ORDER BY mt.Name) 
     FROM MainTable mt LEFT JOIN 
      SupportTable1 so 
      ON so.Name = mt.Name LEFT JOIN 
      SupportTable2 st 
      ON st.Name = mt.Name 
     ORDER BY Row; 
0

mit SQL Server 2012 starten, OFFSET und FETCH NEXT der ORDER BY Klausel hinzugefügt wurden.

SELECT mt.Name, mt.IDNO, so.IDType 
FROM MainTable mt WITH(NOLOCK) 
LEFT JOIN SupportTable1 so WITH(NOLOCK) ON so.Name = mt.Name 
LEFT JOIN SupportTable2 st WITH(NOLOCK) ON st.Name = mt.Name 
ORDER BY mt.Name OFFSET 0 ROWS FETCH NEXT 100000 ROWS ONLY; 

Dann 100000 auf die OFFSET-Nummer mit jeder neuen Iteration hinzuzufügen.