使用另一个表中的数据更新一个表

时间:2010-07-15 13:44:45

标签: sql tsql sql-server-2008

我正在尝试通过从另一个表中绘制数据来更新当前表。 我的数据库(dbo_finance) 专栏 - 测试

另一个数据库是assestsc,我将从列issuename1中提取数据, 但是我只想在字段[MinSecClass] = 9时拉出issuename1。 这就是我写的

UPDATE dbo_finance 
SET [dbo_finance].cusip9 = AssetsC.cusip
FROM dbo_finance INNER JOIN AssetsC ON dbo_finance.test = AssetsC.[IssueName1]
WHERE (AssetsC.MinSecClass = 9)

谢谢,第一次真正使用SQL

3 个答案:

答案 0 :(得分:2)

我会使用别名,这是一个很好的习惯:

UPDATE f
SET [dbo_finance].cusip9 = AssetsC.cusip 
FROM dbo_finance f 
INNER JOIN AssetsC a ON f.test = a.[IssueName1] 
WHERE (a.MinSecClass = 9) 

现在,如果资产表只为每条记录返回一个cuspid值,那么它将正常工作。如果这是一对多的关系,您可能需要变得更复杂才能真正得到您想要的答案。

我在你的表格结构中看到了几个严重的设计缺陷。首先加入依赖于作为问题名称本身不稳定的字段的字段是一个非常糟糕的选择。您希望PK和FK字段不变。使用代理键和唯一索引。

你有一个名为cusp9的字段的事实向我表明你正在对数据进行非规范化。你真的需要这样做吗?你是否认为这个更新必须在一个触发器中运行,因为与MinSecClass相关的尖头发生了变化?你是否正规化?你目前有性能问题吗?当您需要来自其中几个编号字段的数据时,这样的非规范化表可能更难以查询。既然您已经拥有资产表中的数据,除了维护噩梦之外,你还会获得哪些重复数据?

答案 1 :(得分:1)

UPDATE dbo_finance
   SET cusip9 = (
                 SELECT A1.cusip
                   FROM AssetsC AS A1 
                  WHERE dbo_finance.test = A1.IssueName1
                        AND AssetsC.MinSecClass = 9
                )
 WHERE EXISTS (
               SELECT *
                 FROM AssetsC AS A1 
                WHERE dbo_finance.test = A1.IssueName1
                      AND A1.MinSecClass = 9
              );

答案 2 :(得分:0)

因为您使用的是SQL 2008,所以您可以利用新的(ish)MERGE语句。

MERGE INTO dbo_finance
USING (SELECT IssueName1, cusip FROM AssetsC WHERE MinSecClass = 9) AS source 
ON dbo_finance.test = source.IssueName1
WHEN MATCHED THEN UPDATE SET dbo_finance.cusip9 = source.cusip;