我有两个表:
表A,用于记录订单:
列:订单ID,金额,商品,明细,用户ID等
表B,用于记录订单状态,例如:已付款,已发货,退款。
列:OrderId,状态,更新时间
我当前的查询:
第一:
select * from TABLE_A
获取订单列表。
然后,获取每个订单的状态:
select top 1 *
from TABLE_B
where OrderId = orderid
order by UpdateTime desc
如何将这两个查询合并为一个查询,并将结果数据合而为一?谢谢。
答案 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子句放在第一个解决方案的子查询中,那么我猜也应该没问题。