2012-03-09 131 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