如何合并这两个查询?

时间:2018-07-11 11:07:21

标签: sql-server entity-framework linq

我有两个表:

  • 表A,用于记录订单:

    列:订单ID,金额,商品,明细,用户ID等

  • 表B,用于记录订单状态,例如:已付款,已发货,退款。

    列:OrderId,状态,更新时间

我当前的查询:

第一:

select * from TABLE_A

获取订单列表。

然后,获取每个订单的状态:

select top 1 * 
from TABLE_B 
where OrderId = orderid 
order by UpdateTime desc

如何将这两个查询合并为一个查询,并将结果数据合而为一?谢谢。

2 个答案:

答案 0 :(得分:0)

尝试这个。https://www.w3schools.com/sql/sql_join.asp

SELECT *
FROM TABLE_A AS ta
INNER JOIN TABLE_B AS tb ON ta.OrderId = tb.OrderId
ORDER BY tb.UpdateTime DESC

答案 1 :(得分:0)

您可以在TABLE_B的子查询中加入TABLE_A。
并结合使用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子句放在第一个解决方案的子查询中,那么我猜也应该没问题。