您的描述不怎么理解啊,可以再描述清楚些么,比如这句“规则名称和ID就是一对多的关系,如果规则名称对应全部的规则”,能否给个例子,如果把A ,B两个表的结构以及引用关系给出的话更好

解决方案 »

  1.   

     在这种情况下,就update为全部,当然ID不止这些,以后还会添加;如果是其中的一条或者两条数据,update为“部分”,无任何数据就是“未建立” 
      

  2.   

    CREATE TABLE Ta
    (
      BomName VARCHAR(32) PRIMARY KEY,
      Status  NVARCHAR(32)
    )
    INSERT INTO ta(BomName,Status) VALUES('VS6620G_H',NULL)
    INSERT INTO ta(BomName,Status) VALUES('VS6621G_H',NULL)
    INSERT INTO ta(BomName,Status) VALUES('VS6622G_H',NULL)
    CREATE TABLE tb
    (
      BomName  VARCHAR(32),
      BOM_SM_RuleID INT
    )ALTER TABLE TB ADD CONSTRAINT FK_BomName FOREIGN KEY(BomName) REFERENCES ta(BomName)INSERT INTO tb(BomName,BOM_SM_RuleID) VALUES('VS6620G_H',2)
    INSERT INTO tb(BomName,BOM_SM_RuleID) VALUES('VS6620G_H',3)
    INSERT INTO tb(BomName,BOM_SM_RuleID) VALUES('VS6620G_H',1)INSERT INTO tb(BomName,BOM_SM_RuleID) VALUES('VS6621G_H',1)
    INSERT INTO tb(BomName,BOM_SM_RuleID) VALUES('VS6621G_H',2)UPDATE ta 
    SET   ta.STATUS = tc.Status
    FROM ta INNER JOIN 
    (
    SELECT ta.BomName,ISNULL(t.counter,0) 'Counter','Status' = CASE 
    WHEN ISNULL(t.counter,0) > 2 THEN N'全部'
    WHEN ISNULL(t.counter,0) <= 0 THEN N'未建'
    ELSE N'部分' END
     FROM ta LEFT JOIN (
    SELECT ta.BomName, COUNT(ta.BomName) 'counter' FROM ta INNER JOIN TB ON ta.BomName = TB.BomName GROUP BY ta.BomName
    ) t ON ta.BomName = t.BomName
    ) tc ON ta.BomName = tc.BomName
      

  3.   


    如果以后添加了记录,那 ELSE N'部分'  这样写不是会报错吗?
      

  4.   


    如果以后添加了记录,那 ELSE N'部分'  这样写不是会报错吗?
    Case 1 ) 在tb中插入ta中存在的记录,只需要执行Update语句就行
    Case 2) 在tb中插入ta中不存在的记录,由于存在外键关系,需要先在ta中加入记录,然后在tb中插入数据,最后更新Update语句。
    所以,Case2比Case1多一步操作,需要满足外键引用。
      

  5.   


    如果以后添加了记录,那 ELSE N'部分'  这样写不是会报错吗?
    Case 1 ) 在tb中插入ta中存在的记录,只需要执行Update语句就行
    Case 2) 在tb中插入ta中不存在的记录,由于存在外键关系,需要先在ta中加入记录,然后在tb中插入数据,最后更新Update语句。
    所以,Case2比Case1多一步操作,需要满足外键引用。不明白啊,能劳驾您再给贴下代码吗?
      

  6.   


    如果以后添加了记录,那 ELSE N'部分'  这样写不是会报错吗?
    Case 1 ) 在tb中插入ta中存在的记录,只需要执行Update语句就行
    Case 2) 在tb中插入ta中不存在的记录,由于存在外键关系,需要先在ta中加入记录,然后在tb中插入数据,最后更新Update语句。
    所以,Case2比Case1多一步操作,需要满足外键引用。不明白啊,能劳驾您再给贴下代码吗?
    case1)  在tb中插入ta中存在的记录,比如在tb中插入INSERT INTO TB VALUES('VS6622G_H',1)
    只需要执行这个update语句:UPDATE ta 
    SET   ta.STATUS = tc.Status
    FROM ta INNER JOIN 
    (
    SELECT ta.BomName,ISNULL(t.counter,0) 'Counter','Status' = CASE 
    WHEN ISNULL(t.counter,0) > 2 THEN N'全部'
    WHEN ISNULL(t.counter,0) <= 0 THEN N'未建'
    ELSE N'部分' END
     FROM ta LEFT JOIN (
    SELECT ta.BomName, COUNT(ta.BomName) 'counter' FROM ta INNER JOIN TB ON ta.BomName = TB.BomName GROUP BY ta.BomName
    ) t ON ta.BomName = t.BomName
    ) tc ON ta.BomName = tc.BomNamecase2) 在tb中插入ta中不存在的记录,比如这条INSERT INTO TB VALUES('VS6623G_H',1)
    需要先更新ta表,先在ta中插入:NSERT INTO ta VALUES('VS6623G_H',N'未建')
    然后在插入tbINSERT INTO TB VALUES('VS6623G_H',1),最后用update更新下UPDATE ta 
    SET   ta.STATUS = tc.Status
    FROM ta INNER JOIN 
    (
    SELECT ta.BomName,ISNULL(t.counter,0) 'Counter','Status' = CASE 
    WHEN ISNULL(t.counter,0) > 2 THEN N'全部'
    WHEN ISNULL(t.counter,0) <= 0 THEN N'未建'
    ELSE N'部分' END
     FROM ta LEFT JOIN (
    SELECT ta.BomName, COUNT(ta.BomName) 'counter' FROM ta INNER JOIN TB ON ta.BomName = TB.BomName GROUP BY ta.BomName
    ) t ON ta.BomName = t.BomName
    ) tc ON ta.BomName = tc.BomName
      

  7.   


    您没明白我的意思,这样写的话,update为“部分”的数据只能是两条记录以内,如果以后ruleID增加了记录(不止1,2,3......),这样写还对吗?  
      

  8.   


    您没明白我的意思,这样写的话,update为“部分”的数据只能是两条记录以内,如果以后ruleID增加了记录(不止1,2,3......),这样写还对吗?  我测试可以,你可以测试下嘛。每次插入数据到表tb,使用Update语句更新下,更新会tb的Status字段,如果某个BomName变成3条,那么status的取值会从‘部分’提升为‘全部’。
      

  9.   

    我在tb表增加了一条数据(  INSERT INTO tb(BomName,BOM_SM_RuleID) VALUES('VS6620G_H',4)),再用update更新了一下,ta的数据就不对了
      

  10.   


    您没明白我的意思,这样写的话,update为“部分”的数据只能是两条记录以内,如果以后ruleID增加了记录(不止1,2,3......),这样写还对吗?  我测试可以,你可以测试下嘛。每次插入数据到表tb,使用Update语句更新下,更新会tb的Status字段,如果某个BomName变成3条,那么status的取值会从‘部分’提升为‘全部’。已经解决了,我用distinct获取了一下总数,谢谢您的帮忙!