Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Показать максимальную дату из дочерней таблицы, если такие записи есть  [new]
Сергей Мирный
Member

Откуда:
Сообщений: 40
Добрый день!

что-то не работает запрос.
есть таблица предметов (Journal_car), которые могут выдаваться много раз (Car_out),
надо в запросе отразить максимальную дату выдачи, если такая имеется, если нет - то значит пусто:

SELECT a.id_j_car,IdMaxDt.dt_out FROM Journal_car a 
INNER JOIN (SELECT b.id_j_car,MAX(b.dt_out) as dt_max FROM Car_out b GROUP BY b.id_j_car) as IdMaxDt 
ON a.id_j_car=IdMaxDt.id_j_car GROUP BY a.id_j_car


ИД предмета - id_j_car
17 ноя 16, 16:38    [19904502]     Ответить | Цитировать Сообщить модератору
 Re: Показать максимальную дату из дочерней таблицы, если такие записи есть  [new]
londinium
Member

Откуда: Киев
Сообщений: 1199
INNER JOIN

поменять на LEFT JOIN
17 ноя 16, 16:40    [19904509]     Ответить | Цитировать Сообщить модератору
 Re: Показать максимальную дату из дочерней таблицы, если такие записи есть  [new]
Сергей Мирный
Member

Откуда:
Сообщений: 40
[quot Сергей Мирный]
SELECT a.id_j_car,IdMaxDt.dt_out FROM Journal_car a 
INNER JOIN (SELECT b.id_j_car,MAX(b.dt_out) as dt_max FROM Car_out b GROUP BY b.id_j_car) as IdMaxDt 
ON a.id_j_car=IdMaxDt.id_j_car GROUP BY a.id_j_car


ошибочка тут: IdMaxDt.dt_out - > IdMaxDt.dt_max
SELECT a.id_j_car,IdMaxDt.dt_max FROM Journal_car a 
INNER JOIN (SELECT b.id_j_car,MAX(b.dt_out) as dt_max FROM Car_out b GROUP BY b.id_j_car) as IdMaxDt 
ON a.id_j_car=IdMaxDt.id_j_car GROUP BY a.id_j_car


но ругается на последний GROUP BY a.id_j_car

Убрал - вроде работает (LEFT тоже отработал).
Но как-то громоздко, может можно попроще?
17 ноя 16, 16:50    [19904558]     Ответить | Цитировать Сообщить модератору
 Re: Показать максимальную дату из дочерней таблицы, если такие записи есть  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Сергей Мирный,

SELECT a.id_j_car,MAX(b.dt_out) 
FROM 
        Journal_car a 
LEFT JOIN
	FROM Car_out b 
ON a.id_j_car=b.id_j_car GROUP BY a.id_j_car
17 ноя 16, 16:53    [19904570]     Ответить | Цитировать Сообщить модератору
 Re: Показать максимальную дату из дочерней таблицы, если такие записи есть  [new]
Сергей Мирный
Member

Откуда:
Сообщений: 40
Сергей Мирный

SELECT a.id_j_car,IdMaxDt.dt_out FROM Journal_car a 
INNER JOIN (SELECT b.id_j_car,MAX(b.dt_out) as dt_max FROM Car_out b GROUP BY b.id_j_car) as IdMaxDt 
ON a.id_j_car=IdMaxDt.id_j_car GROUP BY a.id_j_car

ошибочка тут: IdMaxDt.dt_out -> IdMaxDt.dt_max
SELECT a.id_j_car,IdMaxDt.dt_max FROM Journal_car a 
INNER JOIN (SELECT b.id_j_car,MAX(b.dt_out) as dt_max FROM Car_out b GROUP BY b.id_j_car) as IdMaxDt 
ON a.id_j_car=IdMaxDt.id_j_car GROUP BY a.id_j_car

ругается на последний GROUP BY a.id_j_car

убрал - работает (LEFT тоже)
Но как-то громоздко получилось,
может есть вариант попроще?
17 ноя 16, 16:53    [19904575]     Ответить | Цитировать Сообщить модератору
 Re: Показать максимальную дату из дочерней таблицы, если такие записи есть  [new]
londinium
Member

Откуда: Киев
Сообщений: 1199
автор
SELECT a.id_j_car,IdMaxDT.dt_max
FROM Journal_car a
LEFT JOIN
(
SELECT b.id_j_car, MAX(b.dt_out) as dt_max
FROM Car_out b
GROUP BY b.id_j_car
)IdMaxDt ON A.id_j_car=IdMaxDt.id_j_car
17 ноя 16, 16:54    [19904582]     Ответить | Цитировать Сообщить модератору
 Re: Показать максимальную дату из дочерней таблицы, если такие записи есть  [new]
Сергей Мирный
Member

Откуда:
Сообщений: 40
TaPaK,

пишет, что:
Column 'Car_out.dt_out' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
17 ноя 16, 17:00    [19904614]     Ответить | Цитировать Сообщить модератору
 Re: Показать максимальную дату из дочерней таблицы, если такие записи есть  [new]
Сергей Мирный
Member

Откуда:
Сообщений: 40
londinium,

так работает
17 ноя 16, 17:01    [19904621]     Ответить | Цитировать Сообщить модератору
 Re: Показать максимальную дату из дочерней таблицы, если такие записи есть  [new]
Сергей Мирный
Member

Откуда:
Сообщений: 40
TaPaK,

все правильно, результат есть, спасибо!
17 ноя 16, 17:04    [19904646]     Ответить | Цитировать Сообщить модератору
 Re: Показать максимальную дату из дочерней таблицы, если такие записи есть  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Сергей Мирный,

Рекомендую вот так

SELECT a.id_j_car, IdMaxDT.dt_max
FROM Journal_car a 
OUTER APPLY 
(
	SELECT TOP 1 b.id_j_car, b.dt_out as dt_max
	FROM Car_out b 
	WHERE A.id_j_car = b.id_j_car
	ORDER BY b.dt_out DESC 
) IdMaxDt 
17 ноя 16, 17:14    [19904686]     Ответить | Цитировать Сообщить модератору
 Re: Показать максимальную дату из дочерней таблицы, если такие записи есть  [new]
FOX75
Member

Откуда:
Сообщений: 29
Сергей Мирный, а для эксперимента со статистикой и планом вот это:
SELECT
	a.[id_j_car],
	IdMaxDT.[dt_max]
FROM [Journal_car] a
left join
	(
	SELECT
		b.[id_j_car],
		b.[dt_out] as [dt_max],
		[rn] = row_number() over(partition by b.[id_j_car] order by b.[dt_out] desc)
	FROM [Car_out] b 
		
	) IdMaxDt on IdMaxDt.[id_j_car] = A.[id_j_car] and IdMaxDt.[rn] = 1

и не забывайте про указание схемы перед таблицами...
18 ноя 16, 10:25    [19906539]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить