0

次のように並べられるようにテーブルをクエリしたい:

1) "entry" 2) "entry#" 3) "entry something" 4) "..entry.."

これは Union All と 4 つの異なるクエリで行いました。

しかし、さらに、ページングを含めて、f.ex を実行できるようにしたいと考えています。行番号 1-100、101-200 などを受け取ります。Row_Num() Over (Order By) を試しましたが、完了しませんでした。Order By 句が自分の注文を破棄するためだと思います。

私のクエリは次のようになります(少し簡略化されています)

SELECT Keyword FROM Keyword WHERE Keyword LIKE 'Keyword' Union All SELECT * FROM Keyword WHERE Keyword like '%Keyword%' AND NOT LIKE 'Keyword'

そして私が試したクエリ全体:

WITH SearchResult as 
(SELECT * FROM Keyword WHERE Keyword like 'Keyword' Union All SELECT * FROM Keyword WHERE Keyword like '%Keyword%' AND NOT LIKE 'Keyword') 
SELECT * FROM 
(SELECT ROW_NUMBER() OVER (ORDER BY Keyword DESC) AS RowNum, * 
 FROM SearchResult) AS Results 
WHERE (RowNum BETWEEN (1 - 1) * 100 + 1 AND 1 * 100)
4

1 に答える 1

0

結合されたクエリを派生テーブルとして別のクエリにラップすると、top句を使用できます。

SELECT TOP 100 * FROM (
   SELECT * FROM table where field = 'entry'
   UNION ALL
   SELECT * FROM table where field = 'entry#'
) sortedresults

その時あなたは正しい軌道に乗っていました。ソートされた結果のサブセットのそれぞれに定義された列を追加すると、それを使用して順序をソートしたままにすることができます。

WITH SearchResult AS
  (SELECT *, ROW_NUMBER() OVER (ORDER BY QueryNum) as RowNum FROM
     (SELECT *, 1 as QueryNum FROM KeywordTable WHERE field = 'Keyword'
      UNION ALL
      SELECT *, 2 from KeywordTable WHERE field = 'Keyword#'
      ) SortedResults
  )
SELECT * from SearchResults WHERE RowNum BETWEEN 4 and 10

各サブクエリをキーワード以外で並べ替えて、実行間で順序が同じになるようにすることも重要です(行番号関数の2番目の並べ替えとして)。例:k1、k2、k3、k4、k5があるとします-k%のようなキーワードを選択すると、k1、k2、k3、k4、k5が一度、k5、k4、k3、k2、k1が次のようになります(SQLは返品順序を保証するものではなく、異なる場合があります)。それはあなたのページングを捨てるでしょう。

于 2010-02-23T14:08:17.607 に答える