У меня две таблицы:
Таблица A, для заказов на запись:
Столбцы: OrderId, Amount, Good, Details, UserId и др.
Таблица B для записи статуса заказа, например: оплачено, отгружено, возмещение.
Столбцы: OrderId, Status, UpdateTime.
Мой текущий запрос:
Первый:
select * from TABLE_A
получить список заказов.
А затем получите статус каждого заказа:
select top 1 *
from TABLE_B
where OrderId = orderid
order by UpdateTime desc
Как я могу объединить эти два запроса в один, а данные результатов в единое целое? Спасибо.
Возможно, здесь больше внимания уделяется CROSS APPLY, если OP хочет сохранить TOP 1.
да, я хочу, чтобы каждая запись заказа была связана с последним статусом заказа.





Попробуйте вот это.
SELECT *
FROM TABLE_A AS ta
INNER JOIN TABLE_B AS tb ON ta.OrderId = tb.OrderId
ORDER BY tb.UpdateTime DESC
если это сделать, одна запись в TABLE_A будет ссылаться на несколько записей TABLE_B, но я хочу, чтобы одна ссылка на один статус заказа был последним. Благодарность
Вы можете присоединиться к TABLE_A по подзапросу с TABLE_B.
И используйте TOP 1 WITH TIES в сочетании с ORDER BY ROW_NUMBER.
SELECT A.*, B.*
FROM TABLE_A AS A
JOIN
(
SELECT TOP 1 WITH TIES *
FROM TABLE_B
ORDER BY ROW_NUMBER() OVER (PARTITION BY Orderid ORDER BY UpdateTime DESC)
) AS B ON (B.OrderId = A.Orderid)
Или даже без подзапроса.
Пример фрагмента:
declare @TABLE_A table (Orderid int);
declare @TABLE_B table (ID int identity(1,1), Orderid int, UpdateTime datetime);
insert into @TABLE_A (Orderid) values (1001),(1002);
insert into @TABLE_B (Orderid, UpdateTime) values
(1001,GetDate()-5),(1001,GetDate()-4),(1001,GetDate()-3)
,(1002,GetDate()-3),(1002,GetDate()-2),(1002,GetDate()-1);
SELECT TOP 1 WITH TIES A.*, B.*
FROM @TABLE_A AS A
LEFT JOIN @TABLE_B AS B ON (B.OrderId = A.Orderid)
ORDER BY ROW_NUMBER() OVER (PARTITION BY A.Orderid ORDER BY B.UpdateTime DESC)
Но у этого есть недостаток, заключающийся в том, что его нельзя упорядочить по дополнительным полям (если вы не поместите его в подзапрос).
Однако у такого подхода есть преимущество.
Если для ограничения результатов добавлено предложение WHERE, то это может быть быстрее, чем первый запрос. Поскольку второй запрос не требует полного сканирования таблицы TABLE_B.
Опять же, если вы поместите предложение WHERE в подзапрос первого решения, я думаю, это тоже должно быть хорошо.
@rikyotei Спасибо за представителя. Я включил альтернативу с фрагментом, использующим переменные таблицы для упрощения тестирования.
он отлично работает, спасибо, я ищу, как преобразовать его в Linq, чтобы я мог использовать его с EF. Спасибо за помощь.