oracle 条件判断(复杂条件判断)
我有两张表:user表(用户名字表),有一个字段:user_name(用户姓名),user_info表(用户信息表)有四个字段:分别是:user_id(用户编号)、use...
我有两张表:user表(用户名字表),有一个字段:user_name(用户姓名),
user_info表(用户信息表)有四个字段:分别是:user_id(用户编号)、user_name(用户姓名)、insert_date(插入时间)、stauts(用户状态)
现在用户名字表中有以下信息:
select * from user
显示结果为:
user_name
张三
李四
王武
何霞
陈红
查询用户信息表为:
select * from user_info
user_id user_name insert_date stauts
1 张三 201001010101 正常
1 张三 200901010236 死亡
1 张三 200305062255 死亡
2 李四 200506091212 死亡
2 李四 200601011215 死亡
2 李四 200705040605 死亡
3 王武 200709040606 正常
3 何霞 200805040607 正常
4 陈红 201005040608 正常
现在我要链表查询:
select a.user_id,a.user_name,a.insert_datea.stauts
from user u,
user_info a
where u.user_name=a.user_name and (后面的条件怎么写?)
就是说我要实现,假如用户姓名相同就取出,但是用户信息表中有重复的,
所以要实现的效果就是假如张三在用户信息表中有三条记录,取数状态为“正常”
的那条,其他的不要取出,还有就是李四在用户信息表中也有三条记录,且状态都是“死亡”,
那么我要取出时间(也就是insert_date时间)距离当前最近的一条记录。
实现以下结果:
user_id user_name insert_date stauts
1 张三 201001010101 正常
2 李四 200705040605 死亡
3 王武 200709040606 正常
4 何霞 200805040607 正常
5 陈红 201005040608 正常
烦请高手解答.谢谢! 展开
user_info表(用户信息表)有四个字段:分别是:user_id(用户编号)、user_name(用户姓名)、insert_date(插入时间)、stauts(用户状态)
现在用户名字表中有以下信息:
select * from user
显示结果为:
user_name
张三
李四
王武
何霞
陈红
查询用户信息表为:
select * from user_info
user_id user_name insert_date stauts
1 张三 201001010101 正常
1 张三 200901010236 死亡
1 张三 200305062255 死亡
2 李四 200506091212 死亡
2 李四 200601011215 死亡
2 李四 200705040605 死亡
3 王武 200709040606 正常
3 何霞 200805040607 正常
4 陈红 201005040608 正常
现在我要链表查询:
select a.user_id,a.user_name,a.insert_datea.stauts
from user u,
user_info a
where u.user_name=a.user_name and (后面的条件怎么写?)
就是说我要实现,假如用户姓名相同就取出,但是用户信息表中有重复的,
所以要实现的效果就是假如张三在用户信息表中有三条记录,取数状态为“正常”
的那条,其他的不要取出,还有就是李四在用户信息表中也有三条记录,且状态都是“死亡”,
那么我要取出时间(也就是insert_date时间)距离当前最近的一条记录。
实现以下结果:
user_id user_name insert_date stauts
1 张三 201001010101 正常
2 李四 200705040605 死亡
3 王武 200709040606 正常
4 何霞 200805040607 正常
5 陈红 201005040608 正常
烦请高手解答.谢谢! 展开
1个回答
展开全部
SELECT t.user_id,t.user_name,t.insert_date, t.stauts
FROM user u,
(SELECT user_id, user_name, insert_date, stauts,
ROW_NUMBER() OVER(PARTITION BY user_id, user_name ORDER BY insert_date DESC) RK
FROM user_info ) t
WHERE u.user_name = t.user_name
AND t.rk = 1
其实你这个最好是用左连接,防止丢失data
SELECT t.user_id, u.user_name, t.insert_date, t.stauts
FROM user u
LEFT JOIN (SELECT user_id, user_name, insert_date, stauts,
ROW_NUMBER() OVER(PARTITION BY user_id, user_name ORDER BY insert_date DESC) RK
FROM user_info ) t
ON t.user_name = u.user_name
AND t.rk = 1
FROM user u,
(SELECT user_id, user_name, insert_date, stauts,
ROW_NUMBER() OVER(PARTITION BY user_id, user_name ORDER BY insert_date DESC) RK
FROM user_info ) t
WHERE u.user_name = t.user_name
AND t.rk = 1
其实你这个最好是用左连接,防止丢失data
SELECT t.user_id, u.user_name, t.insert_date, t.stauts
FROM user u
LEFT JOIN (SELECT user_id, user_name, insert_date, stauts,
ROW_NUMBER() OVER(PARTITION BY user_id, user_name ORDER BY insert_date DESC) RK
FROM user_info ) t
ON t.user_name = u.user_name
AND t.rk = 1
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |