用户商品分类表
userid int '用户ID号
rackcode varchar(9) '分类代号
就这样,主键是两个,如
A 用户有数据
  A    001001
  A    001003
  A    001003001
B 用户有数据
  B    001001
  B    001003
  B    001003001
  B    001003002

解决方案 »

  1.   

    我也想了2天,刚刚我不相信,我觉得我的是对的,细细想,你的答案有错误?!
    现在想用查询语句查找出 A 和 B 各自还没有选择的分类,如
    A 没有选择的分类 001002,001003(列出不能选),001003002 
    B 没有选择的分类 001002 (由于001003下的子类都被选了,所有001003不需要查找出来)
    漏了一个,例如a没有选001,b也没有选择001,结果集合应该是:
     A 没有选择的分类 001,001002,001003(列出不能选),001003002 
    B 没有选择的分类 001,001002 (由于001003下的子类都被选了,所有001003不需要查找出来)
    不知道我理解对不对!?////////////
    reate table #a (rackcode varchar(9),rackname varchar(40),
    parentrackcode varchar(9),childflag bit)
    create table #b (usr varchar(10),rackcode varchar(9))
    /*rackcode varchar(9) '分?代?
    rackname varchar(40) '分?名?
    parentrackcode varchar(9) '父?代?,0表示?有父?
    childflag bit '是否有子??志 0?有子?,1有子?
    比如有如下?据
    001       aaa   0      1
    001001    aaa1  001    0
    001002    aaa2  001    0
    001003    aaa3  001    1
    001003001 aaa31 001003 0
    001003002 aaa32 001003 0
    */
    insert into #a values ('001','aaa','0',1)
    insert into #a values ('001001','aaa1','001',0)
    insert into #a values ('001002','aaa2','001',0)
    insert into #a values ('001003','aaa2','001',1)
    insert into #a values ('001003001','aaa31','001003',0)
    insert into #a values ('001003002','aaa32','001003',0)
    insert into #b values('a','001001')
    insert into #b values('a','001003')
    insert into #b values('a','001003001')
    insert into #b values ('b','001001')
    insert into #b values('b','001003')
    insert into #b values('b','001003001')
    insert into #b values ('b','001003002')select * from #a 
    select * from #b
    /*
    rackcode  rackname                                 parentrackcode childflag 
    --------- ---------------------------------------- -------------- --------- 
    001       aaa                                      0              1
    001001    aaa1                                     001            0
    001002    aaa2                                     001            0
    001003    aaa2                                     001            1
    001003001 aaa31                                    001003         0
    001003002 aaa32                                    001003         0
    */
    select distinct b.usr,a.rackcode from #b b
    cross join #a a 
    where  
    (a.childflag = 0 and not exists(
    select c.rackcode from #b c where c.usr = b.usr and c.rackcode = a.rackcode  
    )
    )
    or

    a.childflag = 1 and exists(
    select c.rackcode from #a c where
     c.parentrackcode = a.rackcode 
    and not exists (select * from #b d where d.rackcode = c.rackcode and d.usr = b.usr)
    )
    )/*
    usr        rackcode  
    ---------- --------- 
    a          001
    b          001
    a          001002
    b          001002
    a          001003
    a          001003002(6 row(s) affected)
    */
      

  2.   

    不好意思,好像creat table 被我copy时候漏掉了一个c字母!:p
      

  3.   

    非常感谢 MorningTea(铁观音+抹茶蛋糕) 
    001确实不是我想要的数据,父类001不需要存在用户分类表中的