您所在的位置: 程序员家园 -> 家园博客 ->
 
在哪里摔倒
就在哪里自己爬起来

用户登录

查  找

最新评论

最新留言

常用网站

网易邮箱 GMAIL  

百度搜索 MSDN

霏凡软件 BT精品

影视帝国 射 手 网

电驴下载 全 库 网

友情连接

茄菲的窝 冰冰博客

枫叶飘零 玫  瑰

ACEN 云 豹 子

统  计



总表和明细表最新数据的inner join
狼子 发表于 2006-3-15 15:48:00 阅读全文 | 回复(0) | 引用通告 | 编辑

两个贴子:http://www.tiantiansoft.com/bbs/dispbbs.asp?boardID=3&ID=5041

http://www.tiantiansoft.com/bbs/dispbbs.asp?boardID=3&ID=5041

举个例子呢,就是有商品表和商品价目表,商品表是总表,价目表是子表,每一个商品在没同的时间都有一个价格的,因为没有把最新价格用触发器写回商品表里,所以需要从价目表取商品的最新价格

先看表的结构:

goods_spec表:有sid(商品编号)、sna(名称)

goods_price表:有pid(价目编号)、price(价格)、ptime(定价时间)

现在需要取到的结果集是这样子的:商品编号、商品名称、最新价格

那要有三步:

1、因为使用group by时,没有使用聚合函数的字段是没成放在select后的,所以要先取出sid(商品编号)和这个商品对应的最新价目的定价时间ptime,使用sql语句:

select sid,min(ptime) ptime from goods_price group by sid

得到这样子的结果集:

假设取到的这个结果集为D

2、取sid(商品编号)和这个商品对应的最新价目price,使用sql语句:

select C.sid,price from goods_price C
inner join D
on C.sid=D.sid and C.ptime=D.ptime

得到这样子的结果集:

假设取到的这个结果集为B

3、取sid(价目编号)、sna(名称)、price(最新价格),使用sql语句:

select A.sna,B.price,A.sid
from goods_spec A
left join B
on A.sid=B.sid

取到这样子的结果集:

这个就是我们最后需要取到的数据了

上边的三步,在第一个贴子里,最后使用了视图的方法,就是把每一步都搞成视图,然后呢,上面“B”和“D”就改成视图名称

在第二个贴子里,用了别名的方法,就是直接在sql里使用子查询,用别名来控制,完整的sql语句是这个:

select A.sna,B.price,A.sid
from goods_spec A
left join (
select C.sid,price from goods_price C
inner join (select sid,min(ptime) ptime from goods_price group by sid) D
on C.sid=D.sid and C.ptime=D.ptime
) B
on A.sid=B.sid

发表评论:

    昵称:
    密码:
    主页:
    标题:
Powered by Oblog.