2012-07-25 77 views
3

我有2个表。我需要更新数据tableB中的数据,使用tableA中的数据填充数据。SQL Server查询更新

但问题在于设计(注意:我无法更改设计,因为它是一个现成的系统,我只需要处理失败)。

比方说tableA(2列)数据源的结构,像这样:

ID | NAME 
1 dude 
2 dud 
3 bro 
4 broo 
5 killa 
6 whale 
--ID is an index and NAME is UNIQUE 

现在tableB(6列)目标(我很难一部分):

ID1 | NAME1 | ID2 | NAME2 | ID3 | NAME3 
1  dude 2  dud  3  bro 
4  broo 5  killa 6  whale 
--All columns here has UNIQUE data though it is not set on the design. 
--and so on until the end. 

现在什么我想要做的是UPDATE这个名字在tableAtableB这个名字对应那里的ID's。

例子:表A的

ID from TableA is 1 
Find ID=1 on TableB 
If ID=1 then UPDATE the next column to 'dude' 

例终是:表B的

ID | Name 
9997 sweet 
9998 jess 
9999 grape 
--The END 

例终是:

ID1 | NAME1 | ID2 | NAME2 | ID3 | NAME3 
9997 sweet1 9998 jess1 9999 grape1 
--The END 

请帮助我。

注:

  • 所有指定表名和列名都只是为了举例说明。
  • 表格中有更多列,但它们不需要更改/更改,所以我没有包含它们的示例。
  • 原因是TableB中的数据已被更改,并且不再匹配正确的数据。
  • 所以我需要用正确的数据重新填充TableB,并且正确数据的唯一来源是TableA
  • 最后,我使用SQL Server 2008的

-----编辑------

这是我的工作是完美的最终查询:

UPDATE CHAR_INFOR 
SET 
    CHARID0=(SELECT CONVERT(VARCHAR,substring(char_data, 9, 16)) from CHAR_DATA0 A WHERE A.CHAR_KEY=CHAR0_KEY), 
CHARID1=(SELECT CONVERT(VARCHAR,substring(char_data, 9, 16)) from CHAR_DATA0 A WHERE A.CHAR_KEY=CHAR1_KEY), 
CHARID2=(SELECT CONVERT(VARCHAR,substring(char_data, 9, 16)) from CHAR_DATA0 A WHERE A.CHAR_KEY=CHAR2_KEY); 

回答

3

好像标准的SQL应该工作:

UPDATE TableB B 
SET Name1=(SELECT Name from TableA A where A.ID=ID1), 
Name2=(SELECT Name from TableA A where A.ID=ID2), 
Name3=(SELECT Name from TableA A where A.ID=ID3); 
0

这取决于你正在使用的MSSQL版本,但如果你使用的版本支持PIVOT关键字,我强烈建议使用它。基本上,您可以“旋转”一个表格,并使用它将您的行转换为列。

如果你没有这个,那么另一种方法是使用一个临时表并自己做一个关键点。这是一个漫长的过程,但相当简单。这里是关于使用临时表dynamic pivoting in sql server的文章。希望这可以帮助!