我正在向表中插入值
如果该记录已经存在,则替换它,如果该记录不存在,则添加一个新记录。
到目前为止,我有以下代码:
INSERT INTO table_name
VALUES (value1, value2, value3,...) where pk="some_id";
但是我需要这样的东西
if not pk="some_id" exists then INSERT INTO table_name
VALUES (value1, value2, value3,...) where pk="some_id"; else update table_name where pk="some_id"
为此,正确的SQL语法是什么?
请注意,我使用的是sql access,我猜它可以是vba和sql的组合
发布于 2010-06-07 19:40:58
首先更新您的导入表和主表之间匹配的行。
UPDATE table_name AS m
INNER JOIN tblImport AS i
ON m.pk = i.pk
SET
m.field2 = i.field2,
m.field3 = i.field3,
m.field4 = i.field4;
然后添加主表中不存在的任何导入记录。
INSERT INTO table_name (
pk,
field2,
field3,
field4)
SELECT
i.pk,
i.field2,
i.field3,
i.field4
FROM
tblImport AS i
LEFT JOIN table_name AS m
ON i.pk = m.pk
WHERE
(((m.pk) Is Null));
发布于 2010-06-07 19:06:09
使用记录集可以很容易地完成此操作。然后,代码将如下所示(对于ADODB记录集):
myRecordset.find ....
if myRecordset.EOF then
myRecordset.addNew
endif
....
myRecordset.fields(...) = ...
....
myRecordset.update
发布于 2010-06-07 19:52:32
我已经在许多不同的论坛上发布了很多很多关于我解决这个问题的方法,但我只想概括一下我使用的方法的基本结构。然而,没有办法一步到位。
这假设有一个公共主键,该主键可用于将现有表与外部数据源链接起来。
任务#2非常简单,只是一个不存在的记录的外连接。
人们可以对#1使用暴力,为主键以外的每个字段编写一个UPDATE语句,但我认为这是混乱和不必要的。另外,因为我有很多复制的应用程序,所以我不能这样做,因为这会导致错误的冲突(当一个字段被更新为与它开始时相同的值时)。
因此,出于这个目的,我使用DAO并编写了一条动态SQL语句来逐列更新。基本结构是这样的:
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim fld As DAO.Field
Dim strField As String
Dim strSet As String
Dim strWhere As String
Dim strSQL As String
Set db = CurrentDB
Set rs = db.OpenRecordset("DestinationTable")
For Each fld in rs.Fields
strField = fld.Name
If strField <> "PKField" Then
strSet = "DestinationTable." & strField & " = ExternalTable." & strField
strWhere = "Nz(DestinationTable." & strField & ",'') = Nz(ExternalTable." & strField & ", '')"
strSQL = "UPDATE DestinationTable "
strSQL = strSQL & " SET " & strSet
strSQL = strSQL & " WHERE " & strWhere
db.Execute strSQL, dbFailOnError
Debug.Print strField & ": " & db.RecordsAffected
End If
Next fld
现在,复杂的部分是处理数字字段、日期字段和字符串字段,因此您必须有一些逻辑来编写WHERE子句,以便根据字段类型使用适当的引号和其他分隔符。我通常不测试字段类型,而是像这样使用CASE SELECT,将字符串字段设为默认字段:
Dim strValueIfNull As String
Select Case strField
Case "DateField1", "DateField2", "NumericField2", "NumericField2", "NumericField3"
strValueIfNull = "0"
Case Else
strValueIfNull = "''"
strWhere = "Nz(DestinationTable." & strField & ", '') = Nz(ExternalTable." & strField & ", '')"
End Select
strWhere = "Nz(DestinationTable." & strField & ", " & strValueIfNull & ") = Nz(ExternalTable." & strField & ", " & strValueIfNull & ")"
我可能把细节弄错了,但我想你明白我的意思了。
这意味着您将只运行与可更新的字段数量相同的SQL更新,并且您将只更新需要更新的记录。如果还用“最后更新”日期标记记录,那么可以在UPDATE SQL中执行此操作,并且只希望对真正具有不同值的记录执行此操作。
https://stackoverflow.com/questions/2992242
复制相似问题