求一条SQL语句

表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列中不存在的记录

7个回答

谢谢楼上指正,呵呵,当时没考虑太多,其实思路是一样的,改一下:

[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的一部分。
应该对","进行拆分,再比较。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐