taotao119
2011-05-04 10:48 阅读 213

求一条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条回答 默认 最新

  • 已采纳
    iteye_8576 iteye_8576 2011-05-09 07:44

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

    [code="sql"]SELECT A.*
    FROM A
    WHERE NOT EXISTS (SELECT 1
    FROM B
    WHERE instr(',' || B.relation || ',', ',' || A.id|| ',' , 1) > 0)[/code]

    点赞 评论 复制链接分享
  • mavlarn mavlarn 2011-05-04 13:39

    试试这个,不确定这样在前后加括号可不可以。
    select a.* from A a, B b where a.id NOT '(' + in b.relation + ')'

    点赞 评论 复制链接分享
  • mavlarn mavlarn 2011-05-04 13:40

    晕,打错了,是:
    select a.* from A a, B b where a.id NOT in '(' + b.relation + ')'

    点赞 评论 复制链接分享
  • katy1206 katy1206 2011-05-04 14:44

    这个比较复杂啊,要自己写一个function来拆分字符串:
    select id,name from A where id not in (select splitStr(str,',') ids from B);其中splitStr(str,',')是自己写的function来拆分字符串。

    点赞 评论 复制链接分享
  • Nalternative Nalternative 2011-05-04 16:07

    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
    )

    点赞 评论 复制链接分享
  • iteye_8576 iteye_8576 2011-05-06 11:19

    不用那么麻烦,看下面的:
    SELECT A.*
    FROM A
    WHERE NOT EXISTS (SELECT 1
    FROM B
    WHERE instr(B.relation, A.id, 1) > 0)

    点赞 评论 复制链接分享
  • iihero iihero 2011-05-08 15:52

    楼上的,不能这么做的。
    A.id可以只是另一个id的一部分。
    应该对","进行拆分,再比较。

    点赞 评论 复制链接分享

相关推荐