Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Помогите склеить две таблицы


Автор: MadCoder 12.5.2008, 09:44
Здравствуйте!

Есть две таблицы. В одной у нас номера договоров (contr_id), во второй - эти договоры и события их выполнений (даты). Нужно сгенерировать таблицу, в которой отображаются все договоры из первой таблицы, а второе поле - последнее событие для этого договора из второй таблицы.
Получилось следующее:
Код

SELECT contr.contr_id, results.res_date from tblContrApplies as contr
left join tblresultsstory as results on contr.contr_id=results.contr_id 
order by (results.res_date);


Все хорошо, только отображает все даты для договоров, а не самый максимальный. Ума не приложу, куда MAX() вставить...

tblContrApplies - здесь лежат номера договоров.
tblresultsstory - здесь лежат события (номера и даты).

Использовать tblContrApplies обязательно, т.к. я оттуда выборку делаю...

База данных MS SQL.

Автор: Akina 12.5.2008, 10:21
Код

SELECT contr.contr_id, max(results.res_date)  as max_date
from tblContrApplies as contr
left join tblresultsstory as results 
  on contr.contr_id=results.contr_id 
group by contr.contr_id;
?

Автор: MadCoder 12.5.2008, 10:31
Офигенно! А как сделать теперь сортировку не по номеру, а по дате results.res_date, начиная с самой ранней, а все нуллы поместить в начало?

Автор: ТоляМБА 12.5.2008, 10:33
Код
Order by 2
В конец запроса

Автор: MadCoder 12.5.2008, 10:39
Спасибо громадное всем, все работает!

Добавлено через 7 минут и 10 секунд
Прошу прощения, но не хочет он с ORDER BY работать в функциях:
Код

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER FUNCTION [dbo].[getOperatorContractList]
(
    @empl_id int
)
RETURNS TABLE 
AS
RETURN 
(
SELECT contr.contr_id, max(results.res_date)  as max_date 
from tblContrApplies as contr
left join tblresultsstory as results 
  on contr.contr_id=results.contr_id 
where contr.empl_id=@empl_id
group by contr.contr_id
Order by 2;
)


Пишет, что:
Msg 1033, Level 15, State 1, Procedure getOperatorContractList, Line 21
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.


Автор: MadCoder 13.5.2008, 08:04
Разобрался, спасибо smile.

Автор: TaNK 13.5.2008, 08:07
Цитата(MadCoder @ 12.5.2008,  10:39)
Спасибо громадное всем, все работает!

Добавлено @ 10:46
Прошу прощения, но не хочет он с ORDER BY работать в функциях:
Код

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER FUNCTION [dbo].[getOperatorContractList]
(
    @empl_id int
)
RETURNS TABLE 
AS
RETURN 
(
SELECT contr.contr_id, max(results.res_date)  as max_date 
from tblContrApplies as contr
left join tblresultsstory as results 
  on contr.contr_id=results.contr_id 
where contr.empl_id=@empl_id
group by contr.contr_id
Order by 2;
)


Пишет, что:
Msg 1033, Level 15, State 1, Procedure getOperatorContractList, Line 21
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.

написано что order не поддерживается в функциях, просмотрах.....и так далее

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)