2010-07-15 118 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 
      ); 
相關問題