2013-10-03 4 views
-1

Когда я выполнить этот запрос к моей базе данных:Каков правильный способ написать этот запрос?

Код:

SELECT TOP 20 
ha.datetime as ha_date, 
ha.id_hist_calls as ha_id_hist_calls, 
ha.name as ha_name, 
s.name as s_name, 
ss.name as ss_name 
FROM Hist_answer ha 
left join Hist_calls hc on hc.id_hist_calls = ha.id_hist_calls 
left join Service s on s.id_service = ha.from_id_service 
left join Service ss on ss.id_service = ha.id_service 

WHERE ha.id_hist_calls NOT IN ( 
SELECT 
ha.id_hist_calls as ha_id_hist_calls 
FROM Hist_answer ha 
WHERE ha.id_firm='39273' AND ha.datetime BETWEEN '2010.06.01 00:00:000' AND '2013.10.01 00:00:000' 
ORDER BY ha.datetime ASC 
) 

AND ha.id_firm='39273' 
AND ha.datetime BETWEEN '2010.06.01 00:00:000' AND '2013.10.01 00:00:000' 
ORDER BY ha.datetime ASC 

Я получаю эту ошибку:

Msg 1033, Level 15, State 1, Line 17 
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified. 

Как я могу исправить этот запрос на выборку?

+1

Именно там в ошибке «Предложение ORDER BY недопустимо в подзапросах». Просто держите последний заказ на –

+3

@the_lotus: сообщения об ошибках чтения - вы слишком много требуете. – zerkms

+0

@the_lotus, но если я удалю порядок по дате, то я правильно сортирую? –

ответ

1

Снимите с ORDER BY пункта из подзапроса

SELECT TOP 20 
ha.datetime as ha_date, 
ha.id_hist_calls as ha_id_hist_calls, 
ha.name as ha_name, 
s.name as s_name, 
ss.name as ss_name 
FROM Hist_answer ha 
left join Hist_calls hc on hc.id_hist_calls = ha.id_hist_calls 
left join Service s on s.id_service = ha.from_id_service 
left join Service ss on ss.id_service = ha.id_service 

WHERE ha.id_hist_calls NOT IN ( 
SELECT 
ha.id_hist_calls as ha_id_hist_calls 
FROM Hist_answer ha 
WHERE ha.id_firm='39273' AND ha.datetime BETWEEN '2010.06.01 00:00:000' AND '2013.10.01 00:00:000' 
) 

AND ha.id_firm='39273' 
AND ha.datetime BETWEEN '2010.06.01 00:00:000' AND '2013.10.01 00:00:000' 
ORDER BY ha.datetime ASC 
+0

Я правильно понимаю - в строках WHERE ha.id_hist_calls NOT IN (....) не нужно использовать порядок? –

+0

да ... нет необходимости в заказе по предложениям в подзапросах – Viji

1

Чтобы расширить немного на то, что другие сказали ...

SQL является набором на основе и множества принципиально неупорядоченные.

NOT IN subquery не заботится о заказе subquery, потому что это операция на основе набора. СУБД может выбрать конкретный физический порядок, который обеспечивает лучшую производительность, но с логической точки зрения порядок не имеет значения.

Вот почему нет никакой цели в том, чтобы заказать subquery - только верхний ORDER BY будет «придерживаться», чтобы иметь какое-либо значение для клиента.

+0

Я правильно понимаю - в строках 'WHERE ha.id_hist_calls NOT IN (....)' не нужно использовать порядок? –

+0

@TeopLome Точно. –

+0

цистерны для информации +1) –

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