【问题标题】:Update depending on field length on another table根据另一个表上的字段长度更新
【发布时间】:2020-02-25 09:22:20
【问题描述】:

我需要根据另一个表中的列数据长度更新表中的列。

表格:

SOURCE:
Item_Group    Name
------------|-----------
1000        | Joe
1001        | Jill
1002        | Joanna
222222      | James
333333      | John

DESTINATION: 
Item        | Group     | Person
------------|-----------|----
1000        | 000001    |
1001        | 000002    |
9998        | 222222    |
9999        | 333333    |


UPDATED DESTINATION: 
Item        | Group     | Person
------------|-----------|----
1000        | 000001    | Joe
1001        | 000002    | Jill
9998        | 222222    | James
9999        | 333333    | John

更新应基于Item_Group 的数据长度。如果datalength为4则根据Item进行更新,如果datalength为6则根据Group进行更新。

我有两个单独的查询,我相信它们可以正常工作。

UPDATE table_dest
SET Person = a.Name
FROM table_source a, table_dest b
WHERE a.Item_Group = b.Item
AND DATALENGTH(a.Item_Group) = 4
GO

UPDATE table_dest 
SET Person = a.Name
FROM table_source a, table_dest b
WHERE a.Item_Group = b.Group
AND DATALENGTH(a.Item_Group) = 6
GO

这是如何在单个查询中完成的?

【问题讨论】:

    标签: sql sql-server switch-statement sql-update case


    【解决方案1】:

    你可以使用apply

    UPDATE dt 
         SET dt.Person = s.Name
    FROM table_dest dt CROSS APPLY
         ( VALUES (dt.Item), (dt.[Group]) 
         ) dtt(ItemGroup) INNER JOIN
         table_source s
         ON s.Item_Group = dtt.ItemGroup;
    

    【讨论】:

    • Msg 209, Level 16, State 1, Line 65 Ambiguous column name 'ItemGroup'.
    【解决方案2】:
    CREATE TABLE #tempSOURCE(Item_Group INT,NAME VARCHAR(50))
    INSERT INTO #tempSOURCE(Item_Group,[NAME])VALUES(1000,'Joe')
    INSERT INTO #tempSOURCE(Item_Group,[NAME])VALUES(1001,'Jill')
    INSERT INTO #tempSOURCE(Item_Group,[NAME])VALUES(1002,'Joanna')
    INSERT INTO #tempSOURCE(Item_Group,[NAME])VALUES(222222,'James')
    INSERT INTO #tempSOURCE(Item_Group,[NAME])VALUES(333333,'John')
    
    CREATE TABLE #tempDESTINATION(Item INT,Destgroup INT,Person VARCHAR(50))
    INSERT INTO #tempDESTINATION(Item, Destgroup, Person) VALUES(1000,000001,'')
    INSERT INTO #tempDESTINATION(Item, Destgroup, Person) VALUES(1001,000002,'')
    INSERT INTO #tempDESTINATION(Item, Destgroup, Person) VALUES(9998,222222,'')
    INSERT INTO #tempDESTINATION(Item, Destgroup, Person) VALUES(9999,333333,'')
    
    SELECT * FROM #tempSOURCE
    
    SELECT * FROM #tempDESTINATION
    
    
    
    UPDATE b 
    SET b.Person= CASE WHEN a.Item_Group=b.Item THEN a.Name ELSE 
                  CASE WHEN  b.Destgroup=a.Item_Group THEN a.Name END END 
    FROM #tempSOURCE a inner join #tempDESTINATION b
    ON a.Item_Group=b.Item
    OR  b.Destgroup=a.Item_Group
    
    
    SELECT * FROM #tempDESTINATION
    

    注意:-这里我使用.. in #tempDESTINATION Destgroup 列名而不是 Group ..因为..Group 是保留关键字...

    我在这里使用连接..而不是检查列的数据长度..你会得到你的输出

    【讨论】:

      【解决方案3】:

      试试这个。

      UPDATE b SET PERSON=nAME
      FROM #tempDESTINATION B 
      cross apply ( 
      
          select * from #tempSOURCE A where a.Item_Group = b.Item and DATALENGTH(a.Item_Group)=4
          UNION
          select * from #tempSOURCE A where a.Item_Group = b.Destgroup and DATALENGTH(a.Item_Group)=6
      ) Name1 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多