当前位置: 代码迷 >> SQL >> 请问一个数据库有关问题()
  详细解决方案

请问一个数据库有关问题()

热度:304   发布时间:2016-05-05 15:31:41.0
请教一个数据库问题(在线等)
给定一张名字变化表namechange 如下:
time oldname newname
1:00 jack peter (1点,名字由jack变为peter,下同)
2:00 peter john
3:00 john mike
4:00 mike alex

要实现的是查询名字存在的时段

查mike
结果为:

name start time end time
mike 3:00 4:00

我是这样实现的:
select t2.newname as name, t2.time as [start time], t1.time as [end time]
from namechange t1, namechange t2
where t2.newname=mike
and t1.oldname=mike

查mike是没有问题,但是查一头一尾的jack和alex就出问题了,
因为不能同时满足 and 前后的条件,所以就会不显示。

而我理想化的状态是,查jack会这样:
name start time end time
jake 0 1:00 (将没有头的设为0)

查alex:
name start time end time
alex 4:00 24:00 (将没有尾的设为24)

问一下各位,要怎么改。(不能对namechange表做改动) 先谢谢了。

------解决方案--------------------
SELECT B.oldname,B.TIME AS starttime,'24:00' AS ENDtime FROM TTH A RIGHT JOIN TTH B ON A.oldname=B.newname
WHERE A.oldname IS NULL
UNION
SELECT A.oldname,'0:00' AS starttime,A.TIME AS endtime FROM TTH A LEFT JOIN TTH B ON A.oldname=B.newname
WHERE B.oldname IS NULL
------解决方案--------------------


SQL code
1> select * from t_siegebaoniu;2> gotime        oldname    newname----------- ---------- ----------          1 jack       peter          2 peter      john          3 john       mike          4 mike       alex(4 rows affected)1> select isnull(t1.time,0),isnull(t2.time,24)2> from3> (select min(time) as time from t_siegebaoniu where newname='jack') t1,4> (select min(time) as time from t_siegebaoniu where oldname='jack') t2;5> go----------- -----------          0           1(1 rows affected)1> select isnull(t1.time,0),isnull(t2.time,24)2> from3> (select min(time) as time from t_siegebaoniu where newname='alex') t1,4> (select min(time) as time from t_siegebaoniu where oldname='alex') t2;5> go----------- -----------          4          24(1 rows affected)1>
  相关解决方案