对不起,我再补充说明一下,资料表A与资料表E没有关联,我只想将资料表A做减肥的动作,
1.如果资料表A中某一ID之五个ITEM记录皆没有资料表E的其中一个组合,则将此笔ID的删除,例如:ID为B之第三笔为 333   999,可是这组合是不存在资料E中的,所以删除。
2. 资料表A中少于资料表E栏位数的记录皆删除,例如:ID为C之第三笔为333,可是只有一笔,而资料表E是二笔,故将ID为C之第三笔记录删除。
不知这样有没有比较清楚一点了呢?
感谢各位前辈的帮忙!

解决方案 »

  1.   

    To:Inspect2008(我主沉浮)
    可以请教一下触发器如何写吗?因为我是个新手,谢谢您~
      

  2.   

    /*资料表D:
    ID     ITEM1    ITEM2     ITEM3     ITEM4    ITEM5
    ========================================================
    A       111      222       333           
    B       444      555       222
    B       444      333       111       666      666
    B       333      999
    C       666      777       222       777      
    C       444      555       222       111
    C       333
    …资料表E:
    ITEM_A      ITEM_B
    ==============================
    111          222
    111          333
    111          666
    222          777
    444          555
    */
    --创建测试环境
    create table D(ID nvarchar(16),ITEM1 int,   ITEM2 int, ITEM3 int,  ITEM4 int, ITEM5 int);
    go
    create table E(ITEM_A int, ITEM_B int);
    goinsert D select 'A',       111,     222,       333, null, null 
    union all select 'B',       444,     555,       222, null, null 
    union all select 'B',       444,     333,       111,      666,    666
    union all select 'B',       333,     999,       null, null,   null
    union all select 'C',       666,     777,       222,      777, null
    union all select 'C',       444,     555,       222,      111, null
    union all select 'C',       333,    null,   null,  null, null insert E select  111,          222
    union all select 111,          333
    union all select 111,          666
    union all select 222,          777
    union all select 444,          555--删除前
    select * from Ddelete D from D
    where not exists(
    select 1 from E 
    where len(replace(replace(isnull(ltrim(ITEM1),'')+isnull(ltrim(ITEM2),'')+isnull(ltrim(ITEM3),'')+isnull(ltrim(ITEM4),'')+isnull(ltrim(ITEM5),''),ltrim(ITEM_A),''),ltrim(ITEM_B),'')) 
    <= len(isnull(ltrim(ITEM1),'')+isnull(ltrim(ITEM2),'')+isnull(ltrim(ITEM3),'')+isnull(ltrim(ITEM4),'')+isnull(ltrim(ITEM5),''))-len(ltrim(ITEM_A) + ltrim(ITEM_B)))--删除后
    select * from D--删除测试环境
    drop table D
    drop table E
      

  3.   

    /*
    执行结果:
    ID                     ITEM1       ITEM2       ITEM3       ITEM4       ITEM5
    ---------------- ----------- ----------- ----------- ----------- -----------
    A                        111         222         333        NULL        NULL
    B                        444         555         222        NULL        NULL
    B                        444         333         111         666         666
    B                        333         999        NULL        NULL        NULL
    C                        666         777         222         777        NULL
    C                        444         555         222         111        NULL
    C                        333        NULL        NULL        NULL        NULL(7 row(s) affected)(2 row(s) affected)ID                     ITEM1       ITEM2       ITEM3       ITEM4       ITEM5
    ---------------- ----------- ----------- ----------- ----------- -----------
    A                        111         222         333        NULL        NULL
    B                        444         555         222        NULL        NULL
    B                        444         333         111         666         666
    C                        666         777         222         777        NULL
    C                        444         555         222         111        NULL(5 row(s) affected)
    */
      

  4.   

    to:dobear_0922(do熊)
    先谢谢您!
    若是以上面数据,是可以做到结果,但是如果有下面一种情形的话,就不行了,
    也就是若某ID的记录为三笔一样时,例如:111,111,111  因为这笔要删除,可是若用您的语法是删除不了的。
      

  5.   

    TO: dobear_0922(do熊)
    您能用这种方法来做真的很厉害,学到很多。
    另外,我又发现了一点问题就是,若资料表E的记录顺序和资料表A不一样的话,也无法删除,例如:资料表A加一笔记录为:555,444
    则无法删除此笔。麻烦您再帮我想想法子了,谢谢您!
      

  6.   

    delete a from 资料表D a where not exists
    (
    select 1 from 资料表E b
    where
    charindex(cast(b.ITEM_A as varchar),isnull(cast(a.ITEM1 as varchar),'')+isnull(cast(a.ITEM2 as varchar),'')+isnull(cast(a.ITEM3 as varchar),'')+isnull(cast(a.ITEM4 as varchar),'')+isnull(cast(a.ITEM5 as varchar),''))>0
    and
    charindex(cast(b.ITEM_B as varchar),isnull(cast(a.ITEM1 as varchar),'')+isnull(cast(a.ITEM2 as varchar),'')+isnull(cast(a.ITEM3 as varchar),'')+isnull(cast(a.ITEM4 as varchar),'')+isnull(cast(a.ITEM5 as varchar),''))>0
    )
    select * from 资料表D
      

  7.   

    如果字段ITEM1、ITEM2、ITEM3、ITEM4、ITEM5和ITEM_A、ITEM_B是varchar或nvarchar就不用cast转换了。如果是char或nchar就rtrim(字段名)把后边的空格截断。
      

  8.   

    /*
    已添加纪录:111,111,111
    已添加纪录:555,444
    如果顺序不一样也要删,再加一个条件。
    */
    declare @D table(ID char(1), ITEM1 int, ITEM2 int, ITEM3 int, ITEM4 int, ITEM5 int)
    insert @D
    select 'A', 111, 111, 111, null, null union all
    select 'A', 111, 222, 333, null, null union all
    select 'B', 444, 555, 222, null, null union all
    select 'B', 444, 333, 111, 666, 666 union all
    select 'B', 333, 999, null, null, null union all
    select 'B', 555, 444, null, null, null union all
    select 'C', 666, 777, 222, 777, null union all
    select 'C', 444, 555, 222, 111, null union all
    select 'C', 333, null, null, null, null
    declare @E table(ITEM_A int, ITEM_B int)
    insert @E
    select 111, 222 union all
    select 111, 333 union all
    select 111, 666 union all
    select 222, 777 union all
    select 444, 555delete a from @D a where not exists
    (
    select 1 from @E b
    where
    charindex(cast(b.ITEM_A as varchar),isnull(cast(a.ITEM1 as varchar),'')+isnull(cast(a.ITEM2 as varchar),'')+isnull(cast(a.ITEM3 as varchar),'')+isnull(cast(a.ITEM4 as varchar),'')+isnull(cast(a.ITEM5 as varchar),''))>0
    and
    charindex(cast(b.ITEM_B as varchar),isnull(cast(a.ITEM1 as varchar),'')+isnull(cast(a.ITEM2 as varchar),'')+isnull(cast(a.ITEM3 as varchar),'')+isnull(cast(a.ITEM4 as varchar),'')+isnull(cast(a.ITEM5 as varchar),''))>0
    and
    charindex(reverse(cast(b.ITEM_B as varchar)),reverse(isnull(cast(a.ITEM1 as varchar),'')+isnull(cast(a.ITEM2 as varchar),'')+isnull(cast(a.ITEM3 as varchar),'')+isnull(cast(a.ITEM4 as varchar),'')+isnull(cast(a.ITEM5 as varchar),'')))
    <
    charindex(reverse(cast(b.ITEM_A as varchar)),reverse(isnull(cast(a.ITEM1 as varchar),'')+isnull(cast(a.ITEM2 as varchar),'')+isnull(cast(a.ITEM3 as varchar),'')+isnull(cast(a.ITEM4 as varchar),'')+isnull(cast(a.ITEM5 as varchar),'')))
    )select * from @D/*
    ID, ITEM1, ITEM2, ITEM3, ITEM4, ITEM5
    A, 111, 222, 333, NULL, NULL
    B, 444, 555, 222, NULL, NULL
    B, 444, 333, 111, 666, 666
    C, 666, 777, 222, 777, NULL
    C, 444, 555, 222, 111, NULL
    */
      

  9.   

    TO: Limpire(昨夜小楼)
    谢谢您!
    请问若记录的顺序也要考虑的话,要如何达到呢?
    例如:资料表A加一笔记录为:555,444
    则无法删除此笔。麻烦您了!
      

  10.   

    TO: Limpire(昨夜小楼)
    抱歉!贴完才看到上面的回贴,我再看看,谢谢您!
      

  11.   

    /*
    已添加纪录:111,111,111
    已添加纪录:555,444
    如果顺序不一样也要删,再加一个条件。哈,不用函数,用patindex一下子就搞定了,代码还更简单:
    又加了纪录:555,444,555,444
    */
    declare @D table(ID char(1), ITEM1 int, ITEM2 int, ITEM3 int, ITEM4 int, ITEM5 int)
    insert @D
    select 'A', 111, 111, 111, null, null union all
    select 'A', 111, 222, 333, null, null union all
    select 'B', 444, 555, 222, null, null union all
    select 'B', 444, 333, 111, 666, 666 union all
    select 'B', 333, 999, null, null, null union all
    select 'B', 555, 444, 555, 444, null union all
    select 'C', 666, 777, 222, 777, null union all
    select 'C', 444, 555, 222, 111, null union all
    select 'C', 333, null, null, null, null
    declare @E table(ITEM_A int, ITEM_B int)
    insert @E
    select 111, 222 union all
    select 111, 333 union all
    select 111, 666 union all
    select 222, 777 union all
    select 444, 555delete a from @D a where not exists
    (
    select 1 from @E b
    where
    patindex('%'+cast(+b.ITEM_A as varchar)+'%'+cast(b.ITEM_B as varchar)+'%',isnull(cast(a.ITEM1 as varchar),'')+isnull(cast(a.ITEM2 as varchar),'')+isnull(cast(a.ITEM3 as varchar),'')+isnull(cast(a.ITEM4 as varchar),'')+isnull(cast(a.ITEM5 as varchar),''))>0
    )select * from @D/*
    ID, ITEM1, ITEM2, ITEM3, ITEM4, ITEM5
    A, 111, 222, 333, NULL, NULL
    B, 444, 555, 222, NULL, NULL
    B, 444, 333, 111, 666, 666
    B, 555, 444, 555, 444, NULL
    C, 666, 777, 222, 777, NULL
    C, 444, 555, 222, 111, NULL
    */
      

  12.   

    TO:hlbhann()
    1.我的代码确实不会删除如:111,111,111的数据,2.但类似555,444这样的数据是不会误删的。
    要避免1中的情况,代码需要稍作修改,但建议你用小楼的方法,他的效率高一些,呵呵
      

  13.   

    这是我修改以后的代码,供你参考(可以删除111,111):
    /*资料表D:
    ID     ITEM1    ITEM2     ITEM3     ITEM4    ITEM5
    ========================================================
    A       111      222       333           
    B       444      555       222
    B       444      333       111       666      666
    B       333      999
    C       666      777       222       777      
    C       444      555       222       111
    C       333
    …资料表E:
    ITEM_A      ITEM_B
    ==============================
    111          222
    111          333
    111          666
    222          777
    444          555
    */
    --创建测试环境
    create table D(ID nvarchar(16),ITEM1 int,   ITEM2 int, ITEM3 int,  ITEM4 int, ITEM5 int);
    go
    create table E(ITEM_A int, ITEM_B int);
    goinsert D select 'A', 111, 222, 333,null,null 
    union all select 'B', 444, 555, 222,null,null 
    union all select 'B', 444, 333, 111,666, 666
    union all select 'B', 333, 999, null,null,null
    union all select 'C', 666, 777, 222,777,null
    union all select 'C', 444, 555, 222,111,null
    union all select 'C', 333, null,null,null,null 
    union all select 'C', 444, 555, 444, 555,null 
    union all select 'C', 111, 111, 111, 111,null 
    union all select 'C', 555, 444, 555,null,444 insert E select  111,          222
    union all select 111,          333
    union all select 111,          666
    union all select 222,          777
    union all select 444,          555--删除前
    select * from Ddelete D from D
    where not exists(
    select 1 from E 
    where replace(isnull(ltrim(ITEM1),'')+isnull(ltrim(ITEM2),'')+isnull(ltrim(ITEM3),'')+isnull(ltrim(ITEM4),'')+isnull(ltrim(ITEM5),''),ltrim(ITEM_A),'') 
    <> isnull(ltrim(ITEM1),'')+isnull(ltrim(ITEM2),'')+isnull(ltrim(ITEM3),'')+isnull(ltrim(ITEM4),'')+isnull(ltrim(ITEM5),'')
    and
    replace(isnull(ltrim(ITEM1),'')+isnull(ltrim(ITEM2),'')+isnull(ltrim(ITEM3),'')+isnull(ltrim(ITEM4),'')+isnull(ltrim(ITEM5),''),ltrim(ITEM_B),'') 
    <> isnull(ltrim(ITEM1),'')+isnull(ltrim(ITEM2),'')+isnull(ltrim(ITEM3),'')+isnull(ltrim(ITEM4),'')+isnull(ltrim(ITEM5),'')
    )
    --删除后
    select * from D--删除测试环境
    drop table D
    drop table E
      

  14.   

    TO:Limpire(昨夜小楼) 
    真是高人,又学习到了!
    可是我又有一个问题,就是资料表E加一笔:22, 777,照理来讲,资料表A有222,777的记录要被删除,可是却没有。TO:dobear_0922(do熊)
    谢谢您^^
      

  15.   

    /*
    这么简单的问题……
    */
    declare @D table(ID char(1), ITEM1 int, ITEM2 int, ITEM3 int, ITEM4 int, ITEM5 int)
    insert @D
    select 'A', 111, 111, 111, null, null union all
    select 'A', 111, 222, 333, null, null union all
    select 'B', 444, 555, 222, null, null union all
    select 'B', 444, 333, 111, 666, 666 union all
    select 'B', 333, 999, null, null, null union all
    select 'B', 555, 444, 555, 444, null union all
    select 'C', 666, 777, 222, 777, null union all
    select 'C', 444, 555, 222, 111, null union all
    select 'C', 333, null, null, null, null
    declare @E table(ITEM_A int, ITEM_B int)
    insert @E
    select 111, 222 union all
    select 111, 333 union all
    select 111, 666 union all
    select 22, 777 union all
    select 444, 555delete a from @D a where not exists
    (
    select 1 from @E b
    where
    patindex('%,'+cast(+b.ITEM_A as varchar)+',%,'+cast(b.ITEM_B as varchar)+',%',',,'+isnull(cast(a.ITEM1 as varchar),'')+',,'+isnull(cast(a.ITEM2 as varchar),'')+',,'+isnull(cast(a.ITEM3 as varchar),'')+',,'+isnull(cast(a.ITEM4 as varchar),'')+',,'+isnull(cast(a.ITEM5 as varchar),'')+',,')>0
    )select * from @D/*
    ID, ITEM1, ITEM2, ITEM3, ITEM4, ITEM5
    A 111 222 333 NULL NULL
    B 444 555 222 NULL NULL
    B 444 333 111 666 666
    B 555 444 555 444 NULL
    C 444 555 222 111 NULL
    */
      

  16.   

    TO:Limpire(昨夜小楼) 
    您真是高人…
    已经无可挑剔了! 
    以后一定要跟您多学习,先给分!^^