各位:
select catalognodecode from originalmanagesetting
catalognodecode 是('ucls20031112200619281475','ucls20031112200200640475','ucls20090218133927812475','ucls20081211090531734475','ucls20080904140301625475','ucls20080904134307406475','ucls20050711164414421475','ucls20041021154758968475','ucls20041021154620859475','ucls20041021154457296475','ucls20041021154320265475','ucls20041021154127703475','ucls20041021153522375475','ucls20040707111157424475','ucls20040523092057860475','ucls20031125121225968475',)的一个字段select * from classnode where nodecode in(
'ucls20031112200619281475','ucls20031112200200640475','ucls20090218133927812475','ucls20081211090531734475','ucls20080904140301625475','ucls20080904134307406475','ucls20050711164414421475','ucls20041021154758968475','ucls20041021154620859475','ucls20041021154457296475','ucls20041021154320265475','ucls20041021154127703475','ucls20041021153522375475','ucls20040707111157424475','ucls20040523092057860475','ucls20031125121225968475')可以查到结果.
为什么
select * from classnode where nodecode in
(select substr(catalognodecode,1,length(catalognodecode)-1) from originalmanagesetting)
查不到结果????
急~~~~~~~~~!!
select catalognodecode from originalmanagesetting
catalognodecode 是('ucls20031112200619281475','ucls20031112200200640475','ucls20090218133927812475','ucls20081211090531734475','ucls20080904140301625475','ucls20080904134307406475','ucls20050711164414421475','ucls20041021154758968475','ucls20041021154620859475','ucls20041021154457296475','ucls20041021154320265475','ucls20041021154127703475','ucls20041021153522375475','ucls20040707111157424475','ucls20040523092057860475','ucls20031125121225968475',)的一个字段select * from classnode where nodecode in(
'ucls20031112200619281475','ucls20031112200200640475','ucls20090218133927812475','ucls20081211090531734475','ucls20080904140301625475','ucls20080904134307406475','ucls20050711164414421475','ucls20041021154758968475','ucls20041021154620859475','ucls20041021154457296475','ucls20041021154320265475','ucls20041021154127703475','ucls20041021153522375475','ucls20040707111157424475','ucls20040523092057860475','ucls20031125121225968475')可以查到结果.
为什么
select * from classnode where nodecode in
(select substr(catalognodecode,1,length(catalognodecode)-1) from originalmanagesetting)
查不到结果????
急~~~~~~~~~!!
解决方案 »
- 表里有格式如'2012-03-01 00:00:00'这样的时间字段,想以某个月份month 作为查询条件,来查询这一个月的数据,sql应该怎么写?
- 求助啊expdp倒不出来
- 求 一个按照从大范围到小范围,级别筛选纪录的sql写法,急~~在线等!!!!
- 急:oracle数据库表空间的.dat文件删除后,还能删掉该表空间吗?
- 插入已经存在的数据时会报主键冲突,如何在插入语句中做判断,有冲突则不插入?
- 请问要把全年的周六,周日的日期查出来的语句要怎么写?
- 请教触发器的写法,帮忙写这个最简单的触发器
- 将1个表的记录插入到另外1个表的记录,但是其中有个字段是序列号怎么操作?
- 关于 oracle 的 forall 语句效率
- 新手求教oracle同比和环比sql语句
- oracle 常见的问题
- 关于equals的作用。。。
select * from classnode where nodecode in
(select substr(catalognodecode,1,length(catalognodecode)-1) from originalmanagesetting)
和你的第一个sql并不一样,第一个是从括号内很多字符串内寻找匹配记录,而第二个是把那些字符串做为一个大串去匹配的,所以第二个查不出来比如我把你的串简化为('a','b')
第一个sql相当于匹配a和b两个字符串
第二个sql相当于去匹配('a','b')这个字符串
不是吧,第一句与第二句不同是因为 一个是从固定的字符串中in,第二个是利用了子查询。你可以这样查询一下
select * from classnode a, originalmanagesetting b
where a.nodecode=b.substr(catalognodecode,1,length(catalognodecode)-1);
看看是否有记录,我觉得还是没有匹配的结果
而且如果这两个表数据量很大,可以用exists来替换掉in
select * from classnode
where exists (select * from originalmanagesetting where nodecode = substr(catalognodecode,1,length(catalognodecode)-1))
这样可能效率会高一点
declare
v_char varchar2(1000);
begin
select substr(catalognodecode,1,length(catalognodecode)-1) into v_char from originalmanagesetting;
execute immediate 'select * from classnode where instr('v_char',nodecode)>0';
end;
如果你想获取查询结果的话可能会用到游标
你可能没看清楚题目,他是把那一大长串存到一个字段里了,用in肯定不能匹配
create or replace package RefCursor is
type t_RefCursor is ref cursor;
end RefCursor;CREATE OR REPLACE FUNCTION test return RefCursor.t_Refcursor is
v_cur RefCursor.t_Refcursor;
v_sql varchar2(4000);
v_char varchar2(1000);
begin
select substr(catalognodecode,1,length(catalognodecode)-1) into v_char from originalmanagesetting;
v_sql:= 'select * from classnode where instr('v_char',nodecode)>0';
open v_cur for v_sql;
--后面自己写了
end;
type t_RefCursor is ref cursor;
end RefCursor;CREATE OR REPLACE FUNCTION test return RefCursor.t_Refcursor is
v_cur RefCursor.t_Refcursor;
v_sql varchar2(4000);
v_char varchar2(1000);
begin
select substr(catalognodecode,1,length(catalognodecode)-1) into v_char from originalmanagesetting;
v_sql:= 'select * from classnode where instr('||v_char||',nodecode)>0';
open v_cur for v_sql;
--后面自己写了
end;
原来的是
('ucls20031112200619281475','ucls20031112200200640475'......,)多了一个','
截取查出来的是
('ucls20031112200619281475','ucls20031112200200640475'......)
它作为一个字符串,现在怎样把它弄成('a','b')这中形式的枚举啊???
或者简单点你可以用上面的pl/sql建一个视图,然后select * from 视图
我能想到的只能这样了
where instr((select code from ttt1 b where code='100103'),a.code)>0如果你能保证select substr(catalognodecode,1,length(catalognodecode)-1) from originalmanagesettin 通过某个条件能返回单条可以像上面那样写,否则就得像 superhsj 所说的那样用游标来输出。还要也可以先将这个表进行行列转换,然后通过中间表的方式用in来实现查询