求个sql

chao121 2015-06-23 08:17:45
A表
id name
1 a1
2 a2

B表
id Aid create_time
1 1 2015-06-23 12:00:00
2 1 2015-06-22 12:00:00
3 2 2015-02-21 12:00:00
4 2 2015-01-21 12:00:00


a1 2015-06-23 12:00:00
a2 2015-02-21 12:00:00
怎么写sql 查出这样的值? 获取B表里面最新时间的数据,A表和B表是一对多

求oracle的sql
...全文
195 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
manageroninstall 2015-07-05
  • 打赏
  • 举报
回复
两个表一关联取rownum不就完了
碧水幽幽泉 2015-06-29
  • 打赏
  • 举报
回复
引用 5 楼 chao121 的回复:
如果B表里面有很多条数据,2楼那样的写法还可行?[quote=引用 1 楼 chengccy 的回复:] 如果只是这两个字段,group by +max 就行了
WITH A(id,name) AS
(SELECT 1, 'a1' FROM DUAL
UNION ALL
SELECT 2, 'a2' FROM DUAL)
, B(id,Aid,create_time) AS 
(SELECT 1, 1, '2015-06-23 12:00:00' FROM DUAL UNION ALL
SELECT 2, 1, '2015-06-22 12:00:00' FROM DUAL UNION ALL
SELECT 3, 2, '2015-02-21 12:00:00' FROM DUAL UNION ALL
SELECT 4, 2, '2015-01-21 12:00:00' FROM DUAL)
SELECT A.NAME,MAX(B.CREATE_TIME) FROM A
LEFT JOIN B
ON B.AID=A.ID
GROUP BY A.NAME
[/quote] 这个方法也是可行的。
chao121 2015-06-24
  • 打赏
  • 举报
回复
如果B表里面有很多条数据,2楼那样的写法还可行?
引用 1 楼 chengccy 的回复:
如果只是这两个字段,group by +max 就行了
WITH A(id,name) AS
(SELECT 1, 'a1' FROM DUAL
UNION ALL
SELECT 2, 'a2' FROM DUAL)
, B(id,Aid,create_time) AS 
(SELECT 1, 1, '2015-06-23 12:00:00' FROM DUAL UNION ALL
SELECT 2, 1, '2015-06-22 12:00:00' FROM DUAL UNION ALL
SELECT 3, 2, '2015-02-21 12:00:00' FROM DUAL UNION ALL
SELECT 4, 2, '2015-01-21 12:00:00' FROM DUAL)
SELECT A.NAME,MAX(B.CREATE_TIME) FROM A
LEFT JOIN B
ON B.AID=A.ID
GROUP BY A.NAME
chao121 2015-06-24
  • 打赏
  • 举报
回复
如果B表里面有很多条数据,2楼那样的写法还可行?
碧水幽幽泉 2015-06-23
  • 打赏
  • 举报
回复
楼上给出的答案是正确的,方法有两种: 1.使用聚合函数:group by+max 2.使用分析函数:row_number()over+order by create_time desc
chengccy 2015-06-23
  • 打赏
  • 举报
回复
如果还需要其他不能聚合的字段,就只能order by +分析函数了
WITH A(id,name) AS
(SELECT 1, 'a1' FROM DUAL
UNION ALL
SELECT 2, 'a2' FROM DUAL)
, B(id,Aid,create_time) AS 
(SELECT 1, 1, '2015-06-23 12:00:00' FROM DUAL UNION ALL
SELECT 2, 1, '2015-06-22 12:00:00' FROM DUAL UNION ALL
SELECT 3, 2, '2015-02-21 12:00:00' FROM DUAL UNION ALL
SELECT 4, 2, '2015-01-21 12:00:00' FROM DUAL)
SELECT *
FROM   A
LEFT   JOIN (SELECT B.*,
                    ROW_NUMBER() OVER(PARTITION BY AID ORDER BY CREATE_TIME DESC) RN
             FROM   B) B
ON     B.AID = A.ID AND
       B.RN = 1
chengccy 2015-06-23
  • 打赏
  • 举报
回复
如果只是这两个字段,group by +max 就行了
WITH A(id,name) AS
(SELECT 1, 'a1' FROM DUAL
UNION ALL
SELECT 2, 'a2' FROM DUAL)
, B(id,Aid,create_time) AS 
(SELECT 1, 1, '2015-06-23 12:00:00' FROM DUAL UNION ALL
SELECT 2, 1, '2015-06-22 12:00:00' FROM DUAL UNION ALL
SELECT 3, 2, '2015-02-21 12:00:00' FROM DUAL UNION ALL
SELECT 4, 2, '2015-01-21 12:00:00' FROM DUAL)
SELECT A.NAME,MAX(B.CREATE_TIME) FROM A
LEFT JOIN B
ON B.AID=A.ID
GROUP BY A.NAME

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧