create table testSomething(
userid varchar(16),--人员编号
cardid int ,--出生证号码
isUsing int,--是否作废 1在使用,2已作废
timeChange datetime --作废时间
);insert into testSomething(userid,cardid,isUsing) values('22',1111,1);
insert into testSomething(userid,cardid,isUsing,timeChange) values('22',2222,2,'2010-09-14 15:28:55.577');
insert into testSomething(userid,cardid,isUsing) values('33',3333,1);
insert into testSomething(userid,cardid,isUsing,timeChange) values('33',4444,2,'2010-09-16 15:28:55.577');
insert into testSomething(userid,cardid,isUsing,timeChange) values('33',5555,2,'2010-09-17 15:28:55.577');
insert into testSomething(userid,cardid,isUsing) values('44',6666,1);--------查询结果,人员编号,出生证编号,变更前的出生证编号(最近作废的那个),没有变更的,显示空值
人员编号 出生证编号,变更前的出生证编号
22 1111 2222
33 3333 5555
44 6666
userid varchar(16),--人员编号
cardid int ,--出生证号码
isUsing int,--是否作废 1在使用,2已作废
timeChange datetime --作废时间
);insert into testSomething(userid,cardid,isUsing) values('22',1111,1);
insert into testSomething(userid,cardid,isUsing,timeChange) values('22',2222,2,'2010-09-14 15:28:55.577');
insert into testSomething(userid,cardid,isUsing) values('33',3333,1);
insert into testSomething(userid,cardid,isUsing,timeChange) values('33',4444,2,'2010-09-16 15:28:55.577');
insert into testSomething(userid,cardid,isUsing,timeChange) values('33',5555,2,'2010-09-17 15:28:55.577');
insert into testSomething(userid,cardid,isUsing) values('44',6666,1);--------查询结果,人员编号,出生证编号,变更前的出生证编号(最近作废的那个),没有变更的,显示空值
人员编号 出生证编号,变更前的出生证编号
22 1111 2222
33 3333 5555
44 6666
解决方案 »
- case when 为空时如何处理
- 刚刚涉足ORACLE。请介绍本ORACLE的书
- 简单的查询问题!!!!!!!
- 日志文件自动丢失ERROR: ORA-01033: ORACLE initialization or shutdown in progress。
- 请问,如何将一个select语句查询得到的结果输出到一个外部文件呢.
- 请教怎么计算一个表的占用空间?
- 关于动态SQL 变量绑定问题
- 2表关联字段的字段定义不同时,关联查询找不到记录?
- varchar2 与 varchar(10)的区别 ?
- 关于insert into select from的使用
- oracle存储过程如何调用带输出参数的函数
- 求助!关于ora-00903,表名无效
2 t2 as (select userid,cardid,isUsing,timeChange from testsomething where isusing=1)
3 select a.userid,a.cardid,b.cardid from t2 a left join t1 b
4 on a.userid=b.userid and b.rn=1
5 ;
USERID CARDID CARDID
---------------- --------------------------------------- ---------------------------------------
22 1111 2222
33 3333 5555
44 6666
SQL>
select userid,cardid,rn from(
select userid,cardid,isusing,timechange,
row_number() over(partition by userid order by timechange desc) rn from testsomething order by userid,timechange
) where rn = 1 or rn = 2
)group by userid
a.cardid,
b.cardid
FROM ( SELECT userid,
cardid
FROM dbo.testSomething
WHERE isUsing = 1
) a
LEFT JOIN ( SELECT userid,
cardid,
timeChange
FROM dbo.testSomething
WHERE isUsing = 2
AND userid + CONVERT(VARCHAR(20), timeChange, 120) IN (
SELECT userid
+ CONVERT(VARCHAR(20), MAX(timeChange), 120)
FROM dbo.testSomething
WHERE isUsing = 2
GROUP BY userid )
) b ON a.userid = b.userid
已写入 file afiedt.buf 1 select b.userid,b.cardid,a.cardid
2 from
3 (select userid,cardid,isUsing
4 from (select userid,cardid,isUsing,timeChange,
5 row_number() over(partition by USERID order by TIMECHANGE desc) rn
6 from testSomething
7 ) where rn=2) a,
8 (select userid,cardid,isUsing from testSomething where isUsing=1) b
9* where a.userid(+)=b.userid
SQL> /USERID CARDID CARDID
---------------- ---------- ----------
22 1111 2222
33 3333 5555
44 6666
谢谢高手 解释一下
此写法是Oracle的连接方式:右连接举个例子:
查看如下语句:
SELECT ename , dname
FROM Emp, Dept
WHERE Emp.Deptno(+) = Dept.Deptno
也可以写成:
SELECT ename , dname
FROM Emp RIGHT JOIN Dept
ON Emp.Deptno = Dept.Deptno
此SQL文使用了右连接,即“(+)”所在位置的另一侧为连接的方向,右连接说明等号右侧的所有记录均会被显示,无论其在左侧是否得到匹配,也就是说上例中无论会不会出现某个部门没有一个员工的情况,这个部门的名字都会在查询结果中出现。 反之:
查看如下语句:
SELECT ename , dname
FROM Emp, Dept
WHERE Emp.Deptno = Dept.Deptno(+)
也可以写成:
SELECT ename , dname
FROM Emp LEFT JOIN Dept
ON Emp.Deptno = Dept.Deptno 则是左连接,无论这个员工有没有一个能在Department表中得到匹配的部门号,这个员工的记录都会被显示 不知道这样解释你觉得怎么样?
谢谢高手 解释一下
---------左连接,和left join等同
+号是比较老的一种写法,建议用jion