表A(id,name)
1 tom
2 jim
3 zz
21 tt
41 ss
表B(id,relation)
1 1,3
2 2,41
表B中的relation存的是A表中的id值的组合,A,B表中id均为int型的主键
期望获得表A的结果为:
id name
21 tt
即期望获得在A表中存在而在B表中的relation列中不存在的记录
谢谢楼上指正,呵呵,当时没考虑太多,其实思路是一样的,改一下:
[code="sql"]SELECT A.*
FROM A
WHERE NOT EXISTS (SELECT 1
FROM B
WHERE instr(',' || B.relation || ',', ',' || A.id|| ',' , 1) > 0)[/code]
试试这个,不确定这样在前后加括号可不可以。
select a.* from A a, B b where a.id NOT '(' + in b.relation + ')'
晕,打错了,是:
select a.* from A a, B b where a.id NOT in '(' + b.relation + ')'
这个比较复杂啊,要自己写一个function来拆分字符串:
select id,name from A where id not in (select splitStr(str,',') ids from B);其中splitStr(str,',')是自己写的function来拆分字符串。
select *
from a
where not exists(
select 1
from (select regexp_substr(dd,'[^,]+',1,level) xx
from (select wm_concat(b.relation) dd from b)
connect by level<=length(dd)-length(replace(dd,',',''))+1
) c
where c.xx=a.ID
)
不用那么麻烦,看下面的:
SELECT A.*
FROM A
WHERE NOT EXISTS (SELECT 1
FROM B
WHERE instr(B.relation, A.id, 1) > 0)
楼上的,不能这么做的。
A.id可以只是另一个id的一部分。
应该对","进行拆分,再比较。