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

Откуда: Харьков, Украина
Сообщений: 1462
Привет всем!
Подскажите пож. идею
Есть две таблицы.
Таблица2 представляет собой некий журнал, и ссылается на Таблицу1 (некие сущности)
Нужно вывести записи из Таблицы1 и для каждой взять последнюю запись журнала (Таблица2).
В журнале может не быть записей для некоторых строк Таблицы1.
Группировка очень нежелательна

Для определенности
WITH table1 as
(SELECT 1 pk_id, 'Obj1' objColumn
UNION
SELECT 2 pk_id, 'Obj2' objColumn
UNION
SELECT 3 pk_id, 'Obj3' objColumn
),
table2 AS
(
SELECT 1 objId, '2017-01-01' dinput, 'Object 1 inserted' msg
UNION
SELECT 1 objId, '2017-01-02' dinput, 'Object 1 updated' msg
UNION
SELECT 1 objId, '2017-01-07' dinput, 'Object 1 deleted' msg
UNION
SELECT 2 objId, '2017-01-01' dinput, 'Object 2 inserted' msg
UNION
SELECT 2 objId, '2017-01-01' dinput, 'Object 2 deleted' msg
)
SELECT *
  FROM table1 t1 LEFT JOIN table2 t2 ON t1.pk_id = t2.objId


результат хотелось бы видеть из серии

ID object dLastEvent Message
1 obj1 '2017-01-07' 'Object 1 deleted'
2 obj2 '2017-01-01' 'Object 2 deleted'
3 obj3
21 июн 17, 18:21    [20581540]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - создание отчета по журналу  [new]
Vadim Romanenko
Member

Откуда: Харьков, Украина
Сообщений: 1462
ПС: SQL Server 2005 Standart
21 июн 17, 18:25    [20581552]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - создание отчета по журналу  [new]
Добрый Э - Эх
Guest
Vadim Romanenko,

поиск последней записи далее left join
21 июн 17, 18:30    [20581572]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - создание отчета по журналу  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7406
Vadim Romanenko,

t1 left join (выборка из t2 последний строки по id)

но у Вас в t2 не по чем сортировать, чтобы найти последнюю.
21 июн 17, 18:31    [20581575]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - создание отчета по журналу  [new]
Vadim Romanenko
Member

Откуда: Харьков, Украина
Сообщений: 1462
Владислав Колосов
но у Вас в t2 не по чем сортировать, чтобы найти последнюю.

Дык по дате же
21 июн 17, 18:39    [20581600]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - создание отчета по журналу  [new]
Vadim Romanenko
Member

Откуда: Харьков, Украина
Сообщений: 1462
Хм. Не уточнил. Колонка dInput - это datetime.
Значения в запросе по идее должны бы автоматом приводиться к datetime (если бы тип колонки был явно указан), но, наверное, нужно было бы явно указать приведение типов в запросе с примером
21 июн 17, 18:41    [20581603]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - создание отчета по журналу  [new]
Добрый Э - Эх
Guest
Vadim Romanenko,

по приведенной мною ссылке что-то непонятно?
21 июн 17, 18:41    [20581604]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - создание отчета по журналу  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7406
Vadim Romanenko
Владислав Колосов
но у Вас в t2 не по чем сортировать, чтобы найти последнюю.

Дык по дате же


Так в таблице на одну дату с одним objId две строки. Какую выбрать последней?
21 июн 17, 18:43    [20581609]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - создание отчета по журналу  [new]
Vadim Romanenko
Member

Откуда: Харьков, Украина
Сообщений: 1462
Итак, доработал тестовый пример. Обновить стартпост не могу, так что здесь
WITH table1 as
(SELECT 1 pk_id, 'Obj1' objColumn
UNION
SELECT 2 pk_id, 'Obj2' objColumn
UNION
SELECT 3 pk_id, 'Obj3' objColumn
),
table2 AS
(
SELECT 1 objId, convert (datetime, '2017-01-01') dinput, 'Object 1 inserted' msg
UNION
SELECT 1 objId, convert (datetime, '2017-01-02') dinput, 'Object 1 updated' msg
UNION
SELECT 1 objId, convert (datetime, '2017-01-07') dinput, 'Object 1 deleted' msg
UNION
SELECT 2 objId, convert (datetime, '2017-01-01') dinput, 'Object 2 inserted' msg
UNION
SELECT 2 objId, convert (datetime, '2017-01-01') dinput, 'Object 2 deleted' msg
)
SELECT *
  FROM table1 t1 LEFT JOIN table2 t2 ON t1.pk_id = t2.objId



Добрый Э - Эх
спасибо за пример. Пытаюсь раскурить.
Пока не получается в связи с тем, что мне нужны не все данные. И вообще запрос более сложный. Но там нужно прикрутить дополнительно таблицу с журналом.
Вобщем, буду думать. Еще раз спасибо
21 июн 17, 18:48    [20581618]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - создание отчета по журналу  [new]
Vadim Romanenko
Member

Откуда: Харьков, Украина
Сообщений: 1462
Владислав Колосов,

это недостатки моего тестового скрипта :) Извиняюсь. Но теоретически если такая ситуация сложится - то любое. Т.е. в физическом порядке
21 июн 17, 18:50    [20581625]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - создание отчета по журналу  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
Vadim Romanenko
Т.е. в физическом порядке
Что это такое??
21 июн 17, 19:19    [20581685]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - создание отчета по журналу  [new]
Vadim Romanenko
Member

Откуда: Харьков, Украина
Сообщений: 1462
iap
Vadim Romanenko
Т.е. в физическом порядке
Что это такое??

Ну есть же физический порядок размещения строк в таблице? На винте, в ОЗУ (если таблица не физическая)?

Вобщем, нашел вроде бы оптимальное решение для себя.
Спасибо Добрый Э - Эх за матерьяльчик

Из минусов. Получается, Таблица1 дважды фильтруется по каким-то условиям, что мне не очень нравится. Но, видимо, что поделать :( В тестовом примере эти самые условия укладываются в 't1.objColumn LIKE 'Obj%'
WITH table1 as
(SELECT 1 pk_id, 'Obj1' objColumn
UNION
SELECT 2 pk_id, 'Obj2' objColumn
UNION
SELECT 3 pk_id, 'Obj3' objColumn
),
table2 AS
(
SELECT 1 objId, convert (datetime, '2017-01-01') dinput, 'Object 1 inserted' msg
UNION
SELECT 1 objId, convert (datetime, '2017-01-02') dinput, 'Object 1 updated' msg
UNION
SELECT 1 objId, convert (datetime, '2017-01-07') dinput, 'Object 1 deleted' msg
UNION
SELECT 2 objId, convert (datetime, '2017-01-01') dinput, 'Object 2 inserted' msg
UNION
SELECT 2 objId, convert (datetime, '2017-01-01') dinput, 'Object 2 deleted' msg
)
SELECT t1.pk_id, t1.objColumn, mq.dinput, mq.msg
  FROM table1 t1
		 LEFT JOIN (select t1.pk_id objId, t2.msg, t2.dinput, row_number() over(partition by t1.pk_id order by t2.dinput desc) rn
					  from table1 t1 left join table2 t2 ON t1.pk_id = t2.objId
					 WHERE t1.objColumn LIKE 'Obj%') mq ON t1.pk_id = mq.objId AND mq.rn = 1
WHERE t1.objColumn LIKE 'Obj%'
21 июн 17, 19:58    [20581764]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - создание отчета по журналу  [new]
aleks2
Guest
Бред сивой кобылы.
Открой для себя OUTER APPLY или, на худой конец, даже коррелированный запрос будет веселее.
22 июн 17, 06:12    [20582213]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - создание отчета по журналу  [new]
aleks2
Guest
WITH table1 as
(SELECT 1 pk_id, 'Obj1' objColumn
UNION
SELECT 2 pk_id, 'Obj2' objColumn
UNION
SELECT 3 pk_id, 'Obj3' objColumn
),
table2 AS
(
SELECT 1 objId, convert (datetime, '2017-01-01') dinput, 'Object 1 inserted' msg
UNION
SELECT 1 objId, convert (datetime, '2017-01-02') dinput, 'Object 1 updated' msg
UNION
SELECT 1 objId, convert (datetime, '2017-01-07') dinput, 'Object 1 deleted' msg
UNION
SELECT 2 objId, convert (datetime, '2017-01-01') dinput, 'Object 2 inserted' msg
UNION
SELECT 2 objId, convert (datetime, '2017-01-01') dinput, 'Object 2 deleted' msg
)
SELECT t1.pk_id, t1.objColumn, mq.dinput, mq.msg
  FROM table1 t1
	   outer apply ( select top(1) t2.msg, t2.dinput from table2 t2 where t1.pk_id = t2.objId order by t2.dinput desc ) mq 
WHERE t1.objColumn LIKE 'Obj%'
22 июн 17, 06:18    [20582215]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - создание отчета по журналу  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7406
iap
Vadim Romanenko
Т.е. в физическом порядке
Что это такое??


Значит какая подвернётся под руку :)
22 июн 17, 12:15    [20583122]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - создание отчета по журналу  [new]
Vadim Romanenko
Member

Откуда: Харьков, Украина
Сообщений: 1462
aleks2
Бред сивой кобылы.
Открой для себя OUTER APPLY или, на худой конец, даже коррелированный запрос будет веселее.

Ваше мнение очень важно для нас. Оставайтесь, пожалуйста, на линии
27 июн 17, 18:38    [20594804]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - создание отчета по журналу  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7406
Vadim Romanenko,

а что не так? Пример ниже этого сообщения не работает?
28 июн 17, 10:26    [20595834]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - создание отчета по журналу  [new]
Vadim Romanenko
Member

Откуда: Харьков, Украина
Сообщений: 1462
Владислав Колосов,

Работает. Как и пример выше.
28 июн 17, 16:09    [20597272]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить