2016-07-15 2 views
1

У меня есть этот запрос:получать тот же самый верх 1 результат в SQL сервере

SELECT 
    IT_approvaldate 
FROM 
    t_item 
WHERE 
    IT_certID_fk_ind = (SELECT DISTINCT TOP 1 IT_certID_fk_ind 
         FROM t_item 
         WHERE IT_rfileID_fk = '4876') 
ORDER BY 
    IT_typesort 

Результат при выполнении этого запроса:

enter image description here

Мне нужно получить этот 1 результат. (2013-04-27 00:00:00) Проблема заключается в том, что я выбираю топ 1, получая 2-й результат.

enter image description here

Я считаю, что причина этого порядка по значению столбца же в этих двух результатов. см ниже,

enter image description here

Однако мне нужно получить только IT_approvaldate верхнюю часть колонны 1, как результат моего запроса.

Как это сделать? Может ли кто-нибудь помочь мне решить эту проблему?

enter image description here

+0

Вы получили то, что вы просили. Оба значения являются «верхними», при сортировке по столбцу они имеют одинаковое значение. Какие дополнительные критерии вы хотите отсортировать? Вы просто хотите исключить NULL? Или вы хотите получить самую последнюю дату утверждения? Или последнее в последнее время? – Blorgbeard

+0

только один критерий: 'IT_typesort' @Blorgbeard – Ashan

+0

Ясно, что это не так, потому что вы сказали, что' null' неприемлемо в примере. Почему это должно быть другое значение, а не null? – Blorgbeard

ответ

1

Привет использование ниже запрос и проверить

SELECT IT_approvaldate FROM t_item WHERE IT_certID_fk_ind =(SELECT DISTINCT top 1 IT_certID_fk_ind FROM t_item WHERE IT_rfileID_fk ='4876') and IT_approvaldate is not null ORDER BY IT_typesort 

Это удалит пустые значения из результата

+0

Мне тоже не нужно нулевое значение. Я не могу игнорировать нулевые значения. мой результат может быть нулевым. проблема в том, что я хочу получить лучший результат в качестве запроса 01 – Ashan

+0

Включите IT_approvaldate в порядке и проверьте, какие результаты вы получите. проверьте порядок дел по asc и desc. – Dotnetpickles

+0

asc & desc gettign же результат – Ashan

1

TSQL Выбрать запросы не являются по сути детерминированной. Вы должны добавить тай-брейк или другую строку, а это не так.

теория является SQL Server не будет предполагать, что значение NULL больше или меньше, чем ваш подряд, а потому, что ваш оператор выбора не логически не реализован до после пункта HAVING, порядок зависит от того, как база данных настроена.

Поймите, что SQL Server может не обязательно выбирать один и тот же путь дважды, если не считать, что это абсолютно лучше. Это является причиной предложения ORDER BY, который будет обрабатывать NULL последовательно (при условии, что существует уникальная группировка).

UPDATE: Это казалось хорошей идеей, чтобы добавить ссылку на документацию MSDN в на ORDER BY. Действительно, неплохо начать с Standard/MSDN. ORDER BY Clause - MSDN

+0

На самом деле SQL Server распознает NULL в ORDER BY, он всегда обрабатывается как меньшее, чем самое низкое значение. – dean

+0

@dean Однако это предложение ORDER BY. нет гарантии, что остальная часть вашего запроса будет последовательно работать без него. –

+1

Согласовано, ORDER BY абсолютно необходимо для предсказуемого заказа. Мое замечание состояло в том, что «SQL Server не предполагает, что значение NULL больше или меньше, чем ваша строка» - семантика ORDER BY понятна по NULL. – dean

1

Если вы хотите NULL быть последним значением в отсортированном списке вы можете использовать ISNULL в ORDER BY предложении заменить NULL на MAX value of DATETIME Ниже кода может помочь:

SELECT TOP 1 IT_approvaldate 
FROM t_item 
WHERE IT_certID_fk_ind = (SELECT DISTINCT top 1 IT_certID_fk_ind FROM t_item WHERE IT_rfileID_fk ='4876') 
ORDER BY IT_typesort ASC, ISNULL(IT_approvaldate,'12-31-9999 23:59:59') ASC; 
+0

'Выбор TOP 1 IT_approvaldate ОТ t_item ГДЕ IT_certID_fk_ind = (SELECT DISTINCT верхний 1 IT_certID_fk_ind ОТ t_item ГДЕ IT_rfileID_fk = '4876') ORDER BY IT_typesort ASC, ISNULL (IT_approvaldate, GETDATE)() ASC;' работает хорошо нужно проверить , Спасибо. немного изменилось 'GETDATE()' – Ashan

+0

@Ashan Можете ли вы отметить это как ответ, если он работает? – Swapnil

+0

да конечно .. не могли бы вы проголосовать за мой вопрос? – Ashan

Смежные вопросы