2012-04-06 5 views
0

Я довольно новичок в использовании MSSQL и столкнулся с какой-то странной проблемой. Учитывая первый идентификатор записи из последнего запроса, мне нужно найти 50 строк до этого, которые отвечают тем же критериям, что и первый запрос, и возвращают их в порядке убывания. Это для сайта ASP.NET, и я уверен, что сторона ASP является правильным, но он дает неправильные результаты, когда я пытаюсь запустить SQL запросВыберите 50 предыдущих строк

Это 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.

Update: Результаты являются первым 50 в таблице, которые имеют firstnames, как (в моем тесте) «Джеймс»

Любая помощь приветствуется :)

+0

Я думаю, что после того, как вы исправить это первая проблема, которую вы все еще будете иметь другой, если вы не измените 'LIKE (переменная)%) '' 'LIKE '(переменная)%')'. Если только это не похоже на то, как вы изменили его, поставив его на свой вопрос. –

+0

Да, это и отсутствующее имя таблицы были как раз у меня сбой при написании моего sql для вопроса, извините всех! – CaffeinatedCM

+0

@ JavaJosh94 Можете ли вы изменить свой вопрос с помощью свойства SQL, чтобы мы могли вам помочь? – Khan

ответ

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 
+0

Большое спасибо !! Я бы никогда не подумал об этом! – CaffeinatedCM

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 
+0

Отмечено и обновлено :) – Khan

2

Как уже говорилось ранее, вы теряете имя таблицы в КТР. Вам также не хватает тех столбцов, которые вы хотели бы взять из CTE.

Вы должны изменить:

SELECT TOP 50 FROM PreviousPosts ORDER BY A_RECID ASC 

к:

SELECT TOP 50 * FROM PreviousPosts ORDER BY A_RECID ASC 
0

Чтобы добавить в список, вы не можете иметь заказ-на внутри КТР. Для того, чтобы получить то, что вы хотите, канавы КТР в целом:

SELECT top 50 * 
FROM [database].[dbo].**[TABLENAME]** 
WHERE (A_1STNAME LIKE (variable)%) 
AND A_RECID < (lastPost) 
ORDER BY A_RECID DESC 
Смежные вопросы