2010-07-15 111 views
0

我想通过从另一个表中绘制数据来更新我当前的表。 我的数据库(dbo_finance) 列 - 当现场[MinSecClass]是= 9测试使用另一个表中的数据更新一个表

的其他数据库是assestsc,我打算从列issuename1提取数据, 但我只是想拉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

+0

什么是AssetsC的主要关键?你需要确保'JOIN'从AssetsC中返回一行,否则你的更新会有些不可预知。 – Toby 2010-07-15 13:50:38

+0

另外,这些不同的表在单独的SQL服务器 dbo_finance表在dev01.finance(服务器,数据库)和 assetsC表在dev02.dw(服务器,数据库) 不知道这样做,所以我把它丢掉了现在 – quickswitch 2010-07-15 14:02:45

+0

使用server.database.owner.table结构。你将不得不建立连接的服务器才能正常工作。阅读有关BOL链接服务器的信息。 – HLGEM 2010-07-15 14:05:11

回答

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; 
+0

感谢大家,我得到了我正在寻找的答案,同时也感谢你向我展示了这个MERGE声明,让我进入下一步,我正在研究,谢谢! – quickswitch 2010-07-16 12:22:29

+0

请将此标记为答案,以便我可以获得一些要点。 – hwiechers 2010-07-16 14:17:25

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更改相关的尖端触发器中运行?你是否反规范化?你目前是否有性能问题?当你需要这些编号字段中的几个数据时,这样的非规格化表可能会更难以查询。既然你已经拥有了资产表中的数据,除了通过复制维护噩梦外,你还得到了什么?

+0

“我会使用别名,这是一个很好的习惯” - 对于正在更新'UPDATE'语句的表,我会强烈反对。您发布的sytax违反了标准SQL,原因很充分。考虑一下:具有相关名称的表格表达式作为物化表,UPDATE将应用于物化表而不是底层基表,即UPDATE不起作用。标准SQL方法具有逻辑性(关于物化表)的便利性和可预测性(因为标量子目是强制执行的。) – onedaywhen 2010-07-15 14:25:04

+0

...这只是对重复子查询(例如从维护角度)的一种耻辱,但是希望是优化器意识到它们是相同的 – onedaywhen 2010-07-15 14:26:01

+0

“事实上,你有一个名为cusp9的字段” - 很好的地方!我同意这种气味。 – onedaywhen 2010-07-15 14:27:16

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 
      ); 
相关问题