2012-03-09 109 views
0

我有一個會計事務處理表,我試圖將它們複製到一個新表中。我已經制作出了副本,但我需要使用源表中的任何新事務更新副本。我遇到的問題是,源數據來自報告,該報告鏈接許多不同來源來創建這些交易,並且沒有唯一的密鑰。更新查詢以獲取沒有唯一鍵的新記錄?

如果我有一個唯一的鍵,我會創建一個更新查詢,並執行從源表到被複製表的左連接,並且只要複製表中的鍵值爲空,就更新這些字段。

由於我沒有一個唯一的密鑰,我不知道如何做到這一點。有任何想法嗎?

-----編輯由於答案-----

SourceTable 
Field1 Field2 Field3 

CopiedTable 
Field1 Field2 Field3 

所以更新與新記錄,我會做這個CopiedTable?

UPDATE CopiedTable SET 
     CopiedTable.Field1 = SourceTable.Field1, 
     CopiedTable.Field2 = SourceTable.Field2, 
     CopiedTable.Field3 = SourceTable.Field3 
WHERE (SourceTable.Field1 <> CopiedTable.Field1 AND 
     SourceTable.Field2 <> CopiedTable.Field2 AND 
     SourceTable.Field3 <> CopiedTable.Field3) 
+0

那麼你應該怎麼知道什麼是更新的價值? – Lamak 2012-03-09 16:12:39

+0

所有字段的組合將使得它獨一無二的是我的假設,我不確定它所需的最少字段數是否是唯一的 – chucklukowski 2012-03-09 16:17:50

回答

1

很難在不看到源表,目標表和查詢的情況下回答問題。

使用由不同表格的所有唯一鍵字段組成的複合鍵。


編輯:

每個表都必須有一個主鍵。這是數據庫的基本設計規則。讓我們假設你有兩個源表A和B

 
Table A 
------- 
A_ID, DataField1, DataField2 

Table B (lined to Table A through A_ID) 
------- 
B_ID, A_ID, DataField3, DataField4 

現在你可以創建一個這樣

SELECT 
    CLng(A.A_ID) AS A_ID, CLng(B.B_ID) AS B_ID, 
    A.DataField1, A.DataField2, B.DataField3, B.DataField4 
INTO 
    C 
FROM 
    A INNER JOIN B ON A.A_ID = B.A_ID; 

表C I會讓A_IDB_IDC主鍵。

如果A_IDB_ID是AutoNumbers我們需要爲了在C.

建立定期若干領域

做一招用CLng如果以後我們想補充與A和B的最新數據C,我們可以做

DELETE * FROM C; 

INSERT INTO C 
    (A_ID, B_ID, DataField1, DataField2, DataField3, DataField4) 
SELECT 
    A.A_ID, B.B_ID, A.DataField1, A.DataField2, B.DataField3, B.DataField4 
FROM 
    A INNER JOIN B ON A.A_ID = B.A_ID; 

如果我們只想更新更改的記錄,我們需要將源與複製鏈接,此外,測試,如果我們在WHERE子句

UPDATE 
    C 
    INNER JOIN (SELECT 
        A.A_ID, B.B_ID, 
        A.DataField1, A.DataField2, B.DataField3, B.DataField4 
       FROM 
        A INNER JOIN B ON A.A_ID = B.A_ID) AS Src 
     ON C.B_ID = Src.B_ID AND C.A_ID = Src.A_ID 
SET 
    C.DataField1 = Src.DataField1, 
    C.DataField2 = Src.DataField2, 
    C.DataField3 = Src.DataField3, 
    C.DataField4 = Src.DataField4 
WHERE 
    C.DataField1<>Src.DataField1 OR 
    C.DataField2<>Src.DataField2 OR 
    C.DataField3<>Src.DataField3 OR 
    C.DataField4<>Src.DataField4; 
變化

子選擇Src可能是另一個存儲的查詢。

+0

+1請顯示更多代碼。 – 2012-03-09 16:18:15

+0

謝謝,使用複合鍵的通用代碼是什麼? – chucklukowski 2012-03-09 16:33:57

+0

UPDATE table SET value = newValue WHERE key1 = 12 AND key2 = 7 AND key3 = 100'。只需創建一個WHERE子句,它與所有的鍵相關。 – 2012-03-09 16:43:59