我有两个表A和B.在不使用子查询的情况下编写查询
它们通过一个名为id的公共字段连接。表B还有一个字段post_code和一个附加到该post_code的日期,这意味着post_code首次输入到数据库中。
我需要选择最新的邮政编码并将其连接到表A上的一行,而不需要子查询。
我有一个子查询解决方案,但它采取了太久
TIA
我有两个表A和B.在不使用子查询的情况下编写查询
它们通过一个名为id的公共字段连接。表B还有一个字段post_code和一个附加到该post_code的日期,这意味着post_code首次输入到数据库中。
我需要选择最新的邮政编码并将其连接到表A上的一行,而不需要子查询。
我有一个子查询解决方案,但它采取了太久
TIA
您可以尝试使用APPLY
Create Table #A(Id int)
Create Table #B(Id int, AId int, PostCode VARCHAR(10), DateAdded DATE)
Insert into #A
Values(1),(2)
Insert into #B
Values(1,1,'NW1', GETDATE()-100),
(2,1,'S20', GETDATE()-200)
Select *
From #A A
CROSS APPLY(SELECT TOP 1 B.*
FROM #B B
WHERE A.Id = B.AId
ORDER BY DateAdded DESC) Latest
不错,谢谢。我以前没有遇到过交叉申请。 – user2573436
@ user2573436:这是你之后的事情吗?你的问题并不清楚 –
我对SQL概念有点朦胧,所以我的问题可能不是最清楚的。我应用了您的解决方案,并提出了我正在寻找的确切答案,欢呼。 – user2573436
份额查询在这里,它给更多clearity –
我能想到的唯一提供解决方案的DBMS是带有'DISTINCT ON'的PostgreSQL。所有其他DBMS需要一个子查询,可以通过过滤'ROW_NUMBER'结果或使用'MAX(date)'子查询或应用'CROSS APPLY'或'LATERAL'子查询。你使用的是什么DBMS,是什么让你认为你不能使用子查询? –
我正在使用SQL Server。我在表A中有超过100万行。在子查询解决方案中,这意味着每行的子查询。正如我在我的问题中所说的那样,时间太长了。 对于服务器较大的人来说,这可能不是问题,但我必须和我坐在我对面的同事一起玩:) – user2573436