两个贴子: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