表a: 
  id  qty  pro  code
  1    15    书   001
  2    15    碟   002
表b: 
  id  qty pro  code
  1    2  碟    002
  2    4  书    001
  3    3  碟    002
  4    3  书    001
  5    1  书/碟 001/002
在上面UPDATE表A的qty时,根据code是否包含'/',如果包含的话两种产品001与002同时减1,不包含的话直接减掉b.qty,请问这SQL要怎样写?
如上表,运算后表A的结果为:
id qty pro code
1   7  书   001
2   9  碟   002

解决方案 »

  1.   

    UDPATE A SET QTY=A.QTY-B.QTY FROM B WHERE CHARINDEX(A.PRO,B.PRO)>0?
      

  2.   

    /*
    标题:分拆列值1
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间:2008-11-20
    地点:广东深圳
    描述有表tb, 如下:
    id          value
    ----------- -----------
    1           aa,bb
    2           aaa,bbb,ccc
    欲按id,分拆value列, 分拆后结果如下:
    id          value
    ----------- --------
    1           aa
    1           bb
    2           aaa
    2           bbb
    2           ccc
    */--1. 旧的解决方法(sql server 2000)
    SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b SELECT A.id, SUBSTRING(A.[values], B.id, CHARINDEX(',', A.[values] + ',', B.id) - B.id)
    FROM tb A, # B
    WHERE SUBSTRING(',' + A.[values], B.id, 1) = ','DROP TABLE #--2. 新的解决方法(sql server 2005) 
    create table tb(id int,value varchar(30))
    insert into tb values(1,'aa,bb')
    insert into tb values(2,'aaa,bbb,ccc')
    go
    SELECT A.id, B.value
    FROM(
        SELECT id, [value] = CONVERT(xml,'<root><v>' + REPLACE([value], ',', '</v><v>') + '</v></root>') FROM tb
    )A
    OUTER APPLY(
        SELECT value = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/root/v') N(v)
    )BDROP TABLE tb/*
    id          value
    ----------- ------------------------------
    1           aa
    1           bb
    2           aaa
    2           bbb
    2           ccc(5 行受影响)
    */
      

  3.   

    create table a(id int, qty int, pro varchar(10), code varchar(10))
    insert into a values(1 ,   15 ,   '书' , '001') 
    insert into a values(2 ,   15 ,   '碟' , '002') 
    create table b(id int, qty int,pro varchar(10) ,code varchar(10))
    insert into b values(1 ,   2 , '碟'   , '002') 
    insert into b values(2 ,   4 , '书'   , '001') 
    insert into b values(3 ,   3 , '碟'   , '002') 
    insert into b values(4 ,   3 , '书'   , '001') 
    insert into b values(5 ,   1 , '书/碟', '001/002') 
    goupdate a set qty = qty - isnull((select sum(qty) from b where charindex('/'+a.code+'/','/'+b.code+'/') >0 ) , 0) from aselect * from adrop table a, b/*
    id          qty         pro        code       
    ----------- ----------- ---------- ---------- 
    1           7           书          001
    2           9           碟          002(所影响的行数为 2 行)
    */
      

  4.   


    update a set a.qty = (select sum(b.qty) from b where b.code like '%a.code%')
      

  5.   

    DECLARE @A TABLE (id INT, qty  INT,pro VARCHAR(10), code VARCHAR(10))
    INSERT @A
    SELECT   1 ,   15 ,   '书',  '001' UNION ALL
    SELECT   2 ,   15 ,   '碟',  '002' DECLARE @B TABLE (id INT, qty  INT,pro VARCHAR(10), code VARCHAR(10))
    INSERT @B
    SELECT  1   , 2 , '碟'   , '002' UNION ALL
    SELECT  2   , 4 , '书'   , '001' UNION ALL
    SELECT  3   , 3 , '碟'   , '002' UNION ALL
    SELECT  4   , 3 , '书'   , '001' UNION ALL
    SELECT  5   , 1 , '书/碟', '001/002' UPDATE @A  SET QTY=A.QTY-(SELECT SUM(B.QTY) FROM  @B B  WHERE CHARINDEX(A.PRO,B.PRO)>0) FROM @A A--SELECT *,A.QTY-(SELECT SUM(B.QTY) FROM  @B B  WHERE CHARINDEX(A.PRO,B.PRO)>0) FROM @A ASELECT * FROM @A
    (所影响的行数为 2 行)
    (所影响的行数为 5 行)
    (所影响的行数为 2 行)id          qty         pro        code       
    ----------- ----------- ---------- ---------- 
    1           7           书          001
    2           9           碟          002(所影响的行数为 2 行)