为了扩展,我创建了一个我的问题的例子来复制我的问题。
我们说我有3张桌子:
人
| PID | PName | City |
Autonumber Text Text
购买
|PurchaseNo | PID | Item |
Autonumber Number Text
导入
|Pname| City | Item
Text Text Text
因此,人与购买表基本上有一对多的关系,每个人可以进行1对多的购买。 PID是Person的PK,同时是Purchase表的FK。因此,如果我直接进行数据输入,那么事情就没问题了。但数据每天早上都有,我必须导入它。它以Import表格的形式出现,其格式与我所显示的格式相同。
所以我的问题是如何将导入数据表分发到两个表,同时保持其1对多关系的完整性。
我采取的一种方法是尝试使用@@ identity,这是我在vba中使用的代码:
Option Compare Database
Public Sub IMPORTRE()
On Error GoTo errHandler
Dim wrk As DAO.Workspace
Dim db As DAO.Database
Dim lngInvoiceID As Long
Set wrk = DBEngine.Workspaces(0)
Set db = wrk.OpenDatabase(CurrentDb.Name)
With wrk
.BeginTrans
db.Execute "INSERT INTO Person SELECT PName,City FROM Import", dbFailOnError
lngInvoiceID = db.OpenRecordset("SELECT @@IDENTITY")(0)
db.Execute "INSERT INTO Purchase SELECT " & lngInvoiceID & " As PID, Item FROM Import ", dbFailOnError
.CommitTrans
Debug.Print "Inserted Invoice header and detail for Invoice " & lngInvoiceID
End With
exitRoutine:
If Not (db Is Nothing) Then
db.Close
Set db = Nothing
End If
Set wrk = Nothing
Exit Sub
errHandler:
MsgBox Err.Number & ": " & Err.Description, vbExclamation, "Error in transaction"
wrk.Rollback
Resume exitRoutine
End Sub
除了一件事之外,哪个工作得很好和花花公子。 PID将始终是导入的最后一个值。
所以我的问题是,我该如何解决这个问题。这是我的代码吗?或者我复杂化了一个简单的问题?重申一下,我想要做的是将导入表中的数据插入到两个具有外键关系的表中。
答案 0 :(得分:0)
假设您的名字是唯一的,您可以使用2个查询执行此操作。第一个从导入表中插入人Person
表中尚不存在的人。
INSERT INTO Person ( PName, City )
SELECT PName, City
FROM Import
WHERE not Exists (Select PName, City from Person WHERE PName = Import.PName);
对于第二个查询,您需要使用联接。这将允许您在一个语句中一起获取现有用户和项目的PID。
INSERT INTO Purchase ( PID, Item )
SELECT Person.PID, Import.Item
FROM Import INNER JOIN Person ON Import.PName = Person.PName;