日期:2014-05-18  浏览次数:20464 次

50分求高手帮忙
有两个表,一个表A的数据项是 AID  AData   Time,其中AID是主键,AData是字符串格式如"123;456;345;765;",另一个表B的数据项BID   BData   AID   ,其中BData的格式为AData中的一个子项如 "765 ",A,B表没有建立联接关系,我现在想在B表中删除这样的记录,符合A表中时间约束(比如Time <2007-8-1)并且AData的分号的个数大于3个,并且BData的数据内容位于AData数据项的后面部分的一个(第三个分号后面的数据部分,分号不考虑)
表A       AID         AData                                                 Time
            1             “1;2;3;4;5;6;”             2007-7-5
            2               “234;1234;6785;1258;”2007-7-6


表B       AID         BData    
              1           “1”
              1           “4”
              2             “1258”
              2           “6785”

注意AData   是VARCHAR  
        BData   是INT

我现在已经实现了从A表中删除多余分号信息,更新后的A表是
表A       AID         AData                                                 Time
            1             “1;2;3;”             2007-7-5
            2               “234;1234;6785;”2007-7-6
但是当我想在B表中搜索那些已经在A表ADATA中删除的数据的记录时,总是搜索到整个B表
我用了这个语句
SELECT   *
FROM   B
WHERE   STR(B.BData)   IN
(SELECT   B.Bdata
  FROM   A
  WHERE  
  CHARINDEX(STR(B.Bdata),A.AData)> 0
)

请高手帮忙啊
绝对给分



------解决方案--------------------
OH! NO!

delete B.* from B, A where B.AID = A.AID and charindex(str(B.BData), A.AData) = 0

------解决方案--------------------
不要用str,改為

Delete B From A, B Where B.AID = A.AID And Charindex(Cast(B.BData As Varchar), A.AData) = 0

另外,有處小筆誤
------解决方案--------------------

--這樣更保險

--如果是全角符號
Delete B From A, B Where B.AID = A.AID And Charindex( '; ' + Cast(B.BData As Varchar) + '; ', '; ' + A.AData + '; ') = 0

--如果是半角符號
Delete B From A, B Where B.AID = A.AID And Charindex( '; ' + Cast(B.BData As Varchar) + '; ', '; ' + A.AData + '; ') = 0