2011-12-12 80 views
2

让说,我有两个表,亲子查询,而无需使用子查询

表A

ID Name 
-- ---- 
1 A 
2 B 

表B

AID Date 
-- ---- 
1 1/1/2000 
1 1/2/2000 
2 1/1/2005 
2 1/2/2005 

现在我需要这个结果,而不使用子查询,

ID Name Date 
-- ---- ---- 
1 A 1/2/2000 
2 B 1/2/2005 

我知道如何使用子查询来做到这一点,但我想避免使用子查询出于某种原因?

+0

应该如何选择结果日期?每个ID的最后日期? – socha23

+0

排名第一的是desc订单 – user960567

+2

回到撰写此规范的人,并告诉他们不要在他们的设计中包含实施细节。 – onedaywhen

回答

6

如果我得到你的意思权利,你需要从表B最新的日期,然后将下面的查询应该这样做:

select a.id,a.name,max(b.date) 
from TableA a 
join TableB b on b.aid = a.id 
group by a.id,a.name 
+0

这看起来很好。谢谢。 – user960567

5
SELECT a.ID, a.Name, MAX(B.Date) 
FROM TableA A 
INNER JOIN TableB B 
    ON B.ID = A.ID 
GROUP BY A.id, A.name 

这是一个简单的聚集。看起来你想每个ID /名称组合的最高日期。

+0

谢谢,dasblinkenlight也有同样的答案。 – user960567

1
create table #t1 (id int, Name varchar(10)) 
create table #t2 (Aid int, Dt date) 

insert #t1 values (1, 'A'), (2, 'B') 
insert #t2 values (1, '1/1/2000'), (1, '1/2/2000'), (2, '1/1/2005'), (2, '1/2/2005') 


;WITH cte (AId, MDt) 
as 
(
select Aid, MAX(Dt) from #t2 group by AiD 
) 
select #t1.Id, #t1.Name, cte.MDt 
from #t1 
join cte 
    on cte.AId = #t1.Id 
+1

新颖的解决方案。 CTE与子查询非常接近,但它基本上是一次性视图。 – JNK