Убрать необходимость во втором запросе T-SQL - PullRequest
0 голосов
/ 27 июня 2019

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

Таблица A: Список действий

ID  |  Activity
----+-----------------------
1   |  Change Oil Filter
2   |  Change brake fluid
3   |  Change brake rotors

Таблица B: Журнал механики

ID | ActivityID  | Date        | Mechanic | Comment
---+-------------+-------------+-------------------------------------------
1  | 1           | 2019-27-06  | John     | Changed the oil filter
2  | 1           | 2019-26-06  | Sally    | No oil filters in stock.
3  | 2           | 2019-20-06  | Sally    | Brake fluid flushed.

Как указано выше, я могу создать следующую таблицу, используя два повторителя (один внутри другого), и это выглядит так.

ActivityID   | Date        | Mechanic | Comment
-------------+-------------+-----------------------------------------
1            | 2019-27-06  | John     | Changed the oil filter
2            | 2019-20-06  | Sally    | Brake fluid flushed.    
3            |             |          |

У меня вопрос: как я могу создать ту же таблицу, но используя только один ретранслятор и 1 запрос T-SQL? Является ли это возможным? Причина в том, что это очень простой список (сокращенный для этой демонстрации) полного списка, который я должен включить для своего журнала работы механиков, и когда я начинаю переходить к более чем 100 действиям, которые можно выполнять на транспортном средстве, страница загружается довольно медленно; предполагая, потому что он должен запустить 2-й ретранслятор + код для каждой записи, которую он связал.

Я также прошу прощения, у меня еще нет «отправной точки» для работы с вами, поскольку ничто из того, что я создал, даже близко не дало результат в одном запросе. У меня возникли проблемы при разработке способа объединения первой части запроса с MAX(Date) во 2-й таблице. Надеемся на некоторую помощь от сообщества, чтобы помочь.

Ответы [ 3 ]

1 голос
/ 27 июня 2019

Вы можете использовать запрос ниже, чтобы получить желаемый результат -

Пример данных

Declare @ActivityList Table
(ID int, Activity varchar(100))

Insert into @ActivityList
values
(1   ,  'Change Oil Filter'    ),
(2   ,  'Change brake fluid'     ),
(3   ,  'Change brake rotors'    )


Declare @MechanicsLog Table
(ID int, ActivityID int, [Date] Date, Mechanic varchar(20), Comment varchar(50))

Insert into @MechanicsLog
values
(1  , 1     ,      '2019-06-27'  , 'John'     , 'Changed the oil filter'   ),
(2  , 1     ,      '2019-06-26'  , 'Sally'    , 'No oil filters in stock.' ),
(3  , 2     ,      '2019-06-20'  , 'Sally'    , 'Brake fluid flushed.'     )

Запрос

;With cte as
(select ActivityID, Max([Date]) [date] from  @MechanicsLog ml
Group By ActivityID
)
Select al.ID, al.Activity, cte.[Date], Mechanic, Comment 
from cte inner join @MechanicsLog ml 
on cte.ActivityID = ml.ActivityID and cte.[date] = ml.[Date]
right join  @ActivityList al on al.ID = ml.ActivityID
order by ID
0 голосов
/ 27 июня 2019

Если вы добавите функцию ROW_NUMBER, чтобы добавить последовательность к каждому идентификатору активности, вы можете отфильтровать ее, чтобы получить только самую последнюю для каждого идентификатора активности.

select ActivityID, Date, Mechanic, Comment 
from 
(
select *, ROW_NUMBER() OVER (PARTITION BY ActivityID order by Date desc) RowNumber
from MechanicsLog
) q1 
where RowNumber = 1

Это дает вам "MAX" запись для каждого ActivityID, но с остальной частью записи, так что вы можете присоединиться к таблице Activity List, если хотите.

0 голосов
/ 27 июня 2019
select 
    act.ActivityID, Max(log.[Date]) as [Date]
from 
    ActivityList act 
inner join 
    MachineLog log on log.ActivityID = act.ActivityID
Group by 
    act.ActivityID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...