0

私はMSSQLの使用にかなり慣れておらず、奇妙な問題に遭遇しました。最後のクエリの最初のレコードIDが与えられた場合、最初のクエリと同じ基準を満たすその前の50行を見つけて、降順で返す必要があります。これはASP.NETサイト用であり、ASP側は正しいと確信していますが、SQLクエリを実行しようとすると間違った結果になります。

これは私が試してきたSQLです

 WITH PreviousPosts AS 
 (
    SELECT *
    FROM [database].[dbo].[table]
    WHERE (A_1STNAME LIKE '(variable)%')
    AND A_RECID < '(lastPost)'
 )
SELECT TOP 50 * FROM PreviousPosts
ORDER BY A_RECID ASC

ここで、「(変数)」と「(lastPost)」は実際に私のC#で正しいパラメーターで埋められています

エラーは発生しなくなりましたが、lastPostとして提供されているものに関係なく、同じ結果が得られます。

更新:結果は、(私のテストケースでは)「James」のような名を持つテーブルの最初の50です。

どんな助けでも大歓迎です:)

4

4 に答える 4

4

CTE にテーブル名がありません。見る**[TABLENAME]**

 WITH PreviousPosts AS 
 (
    SELECT *
    FROM [database].[dbo].**[TABLENAME]**
    WHERE (A_1STNAME LIKE (variable)%)
    AND A_RECID < (lastPost)
    ORDER BY A_RECID DESC
 )
SELECT TOP 50 * FROM PreviousPosts
ORDER BY A_RECID ASC
于 2012-04-06T18:41:05.027 に答える
2

前述のように、CTE にテーブル名がありません。また、CTE から取得したい列がありません。

変更する必要があります:

SELECT TOP 50 FROM PreviousPosts ORDER BY A_RECID ASC

に:

SELECT TOP 50 * FROM PreviousPosts ORDER BY A_RECID ASC
于 2012-04-06T18:45:20.803 に答える
0

私があなたのスキーマについて知っていることで、これが試みです。私はまだ私が満足できるよりも多くの仮定をしなければならなかったので、これはそのままでは正しくないかもしれません:

;WITH RankedRecords AS
(
    SELECT
        ROW_NUMBER() OVER(ORDER BY A_RECID DESC) Row
        , A_RECID
    FROM [database]..[table]
    WHERE A_1STNAME LIKE '(variable)%')
        AND CAST(LEFT(A_RECID, 8) AS DATE) < CAST(LEFT('(lastPost)', 8) AS DATE)
)
SELECT TOP 50
    T.*
FROM[database]..[table] T
INNER JOIN RankedRecords
    ON RankedRecords.A_RECID = T.A_RECID
    AND RankedRecords BETWEEN (@LastPost - 51) AND (@LastPost - 1)
ORDER BY RankedRecords.Row
于 2012-04-06T19:48:15.637 に答える
0

リストに追加するには、CTE 内にオーダーバイを含めることはできません。あなたが望むものを得るために、CTEを完全に捨ててください:

SELECT top 50 * 
FROM [database].[dbo].**[TABLENAME]** 
WHERE (A_1STNAME LIKE (variable)%) 
AND A_RECID < (lastPost) 
ORDER BY A_RECID DESC 
于 2012-04-06T18:48:35.027 に答える