两个表 ,一个表存id,另一个表存明细,测试表如下:
tb
P_id number (15)
partmentname varchar(15)
userid varchar(15)
测试数据
1 部门1 1
2 部门2 2,3
3 部门3 4
user
id number(15)
name varchar(15)
age number(3)测试数据
1 zhang 25
2 lisi 29
3 wangwu 48
4 zhaoliu 27select name from user where id in( select userid from tb where P_id=2 ) 就不行报错,应该是类型转换的问题,大家帮看一下。
tb
P_id number (15)
partmentname varchar(15)
userid varchar(15)
测试数据
1 部门1 1
2 部门2 2,3
3 部门3 4
user
id number(15)
name varchar(15)
age number(3)测试数据
1 zhang 25
2 lisi 29
3 wangwu 48
4 zhaoliu 27select name from user where id in( select userid from tb where P_id=2 ) 就不行报错,应该是类型转换的问题,大家帮看一下。
SQL> select * from tb; P_ID PARTMENTNAME USERID
---------------- --------------- ---------------
1 部门1 1
2 部门2 2,3
3 部门3 4SQL> select * from usert; ID NAME AGE
---------------- --------------- ----
1 zhangsan 25
2 lisi 49
3 wangwu 48
4 zhaoliu 27SQL>
SQL> select name
2 from usert
3 where exists (select 1
4 from tb
5 where P_id = 2
6 and instr(tb.userid, usert.id) > 0)
7 ;NAME
---------------
lisi
wangwu
SELECT "NAME" FROM "USER" WHERE ID IN (SELECT USERID FROM TB WHERE P_ID = 2);
select name from user where id in( select userid from tb where P_id=2 ) --ora-01722 invalid number用这种方法
SQL>
SQL> select name
2 from usert
3 where exists (select 1
4 from tb
5 where P_id = 2
6 and instr(tb.userid, usert.id) > 0)
7 ;
P_id=1 可以,可以查到一条记录
P_id=2 没有记录
等于执行 select name from user where id in('2,3')
执行肯定报错,id是NUMBER
select * from emp where deptno=30;
2、列出所有办事员的姓名、编号和部门。“CLERK”
select ename, empno,d.dname from emp e,dept d where e.deptno = d.deptno and job='CLERK';
3、找出佣金高于薪金的雇员
select * from emp where nvl(comm,0)>sal;
3.1、找出佣金最高的雇员
select * from (select b.*,rownum r from (select e.* from emp e order by nvl(comm,0) desc) b) where r=1;
4、找出佣金高于薪金60%的雇员
select * from emp where nvl(comm,0)>sal*60/100;
5、找出部门10中所有经理和部门20中所有办事员的详细资料
select * from emp where (deptno=10 and job='MANAGER') or (deptno =20 and job='CLERK');6、找出部门10中所有经理、部门20中所有办事员以及既不是经理又不是办事员但其薪金大于或等于2000的所有雇员的详细资料
select * from emp where (deptno=10 and job='MANAGER') or (deptno =20 and job='CLERK')or(job !='MANAGER' and job!='CLERK' and comm>=2000);
7、找出收取佣金的雇员的不同工作
select * from emp where comm is not null;
8、找出不收取佣金或收取的佣金低于100的雇员
select * from emp where comm is null or comm<100;
9、找出各月最后一天受雇的所有雇员
select * from emp where hiredate=last_day(hiredate);
10、找出早于12年之前受雇的雇员
select * from emp where months_between(sysdate,hiredate)>=12;
11、显示只有首字母大写的所有雇员的姓名
select ename from emp where ename=initcap(ename);
12、显示正好为15个字符的雇员的姓名
select * from emp where length(ename)=15;
13、显示不带有"R"的雇员姓名
select * from emp where instr(ename,'R')=0;
14、显示所有雇员的姓名的前三个字符
select substr(ename,1,4) from emp;
15、显示所有雇员的姓名,用"a"替换所有的"A"
select ename,replace(ename,'A','a') from emp;
16、显示所有雇员的姓名以及满10年服务年限的日期
select ename,hiredate from emp where months_between(sysdate,hiredate)/12>10;
17、显示雇员的详细资料,按姓名排序
select * from emp order by ename;
18、显示雇员姓名,根据其服务年限,将最老的雇员排在最前面。
select * from emp order by HIREDATE;
19、显示所有雇员的姓名、工作和薪金,按工作内的工作的降序顺序排序,而工作按薪金排序
select ename,job,comm from emp order by job desc,comm;
20、显示所有雇员的姓名和加入公司的年份和月份,按雇员受雇日所在月排序,并将最前年份的排在最前面
select ename,hiredate from emp order by extract(year from hiredate),extract(month from hiredate);
21、显示在一个月为30天的情况下所有雇员的日薪金,忽略余数
select ename,floor(comm/30) from emp;
22、找出在(任何年份的)2月受聘的所有雇员
select * from emp where extract(month from hiredate)=2;
23、对于每个雇员,显示其加入公司的天数
select ename,floor(months_between(sysdate,hiredate)*360) from emp;
24、显示姓名字段的任何位置包含"A"的所有雇员的姓名
select * from emp where instr(ename,'A')>0;
25、以年、月和日显示所有雇员的服务年限
select floor(months_between(sysdate,hiredate)/12)||'年', floor(months_between(sysdate,hiredate))||'月',floor((sysdate-hiredate))||'日'from emp;