1

是否可以编写一个查询来循环遍历两列表的行,检查第一列的某个标识符并将第二列中的数据复制到新表中?

例子:

tblSurveyData
FirstColumn     Second Column
A0              John
A2              Smith
A3              05-01-1973

tblSurveyReport
FirstName   MiddleName  LastName    DateOfBirth 
John                    Smith       05-01-1973

A0 数据将转到 FirstName、A1 MiddleName、A2 LastName 和 A3 DateOfBirth。还有更多的标识符和字段,但作为一个示例,您将如何使用 Access 中的查询来执行此操作,或者 VBA 是更好的解决方案吗?

我想出的唯一解决方案是以下 VBA,但这绕过了两列表并尝试插入到 tblSurveyReport 表中。不幸的是,它将每条数据放入自己的行中,这无济于事。

If Identifier = "A0" Then
DoCmd.RunSQL "INSERT INTO tblSurveyReport " _
            & "(FirstName) " _
            & "VALUES ('" & Info & "')"
ElseIf Identifier = "A1" Then
DoCmd.RunSQL "INSERT INTO tblSurveyReport " _
            & "(MiddleName) " _
            & "VALUES ('" & Info & "')"
ElseIf Identifier = "A2" Then
DoCmd.RunSQL "INSERT INTO tblSurveyReport " _
            & "(LastName) " _
            & "VALUES ('" & Info & "')"
ElseIf Identifier = "A3" Then
DoCmd.RunSQL "INSERT INTO tblSurveyReport " _
            & "(DateOfBirth) " _
            & "VALUES ('" & Info & "')"
End If

但是,每条数据都进入自己的行,我需要它们都在同一行中。

任何帮助是极大的赞赏。

提前致谢。

TC

4

3 回答 3

1

INSERT INTO与 SELECT 语句一起使用

INSERT INTO tblSurveyReport(FirstName) SELECT FirstName FROM tblSurveyData where FirstColumn = 'A0'

INSERT INTO tblSurveyReport(MiddleName) SELECT MiddleName FROM tblSurveyData where FirstColumn = 'A1'

您可以使用 DoCmd 运行它,作为 Access 中的查询等。

于 2013-09-06T15:14:59.910 回答
0

您可以只有两个记录集,如下所示:

  • 第一个记录集:rsSurveyData
  • 第二个记录集:rsSurveyReport

这个想法是沿着它的记录浏览第一个记录集,沿着它的字段浏览第二个。

根据您使用的记录集对象(DAO 或 ADODB),打开语法会略有不同,但您可以在帮助中找到所有详细信息。我在这里使用“查找”、“移动”和“更新”方法的 ADODB 语法。DAO 记录集在更改数据之前需要一个额外的“编辑”方法。而且我不记得记录集对象的字段集合是从0还是1索引...

然后:

rsSurveyData.moveFirst
rsSurveyReport.Find "FirstName ='" & rsSurveyData.fields("A0") & "'"
if rsSurveyReport.EOF then
    'do what you have to do when the record does not exist, for example:'
    rsSurveyReport.addNew
    rsSurveyreport.fields(1) = rsData.fields(1)
Else
    'you''ve just found the record that needs to be updated'
    for i = 2 to rsSurveyData.recordcount
        rsSurveyData.move i, 1    
        rsSurveyReport.fields(i)=rsSurveyData.fields(1) 
    next i
    rsSurveyReport.update
Endif
于 2013-09-06T11:38:17.860 回答
0

您将需要将您的记录链接在一起的东西。如果数据被重新排序会发生什么?你怎么知道你的例子中的所有信息都应该在同一个记录中?我相信执行此类操作的唯一方法是在您的第一个表中创建第三个字段,该字段确定哪些数据属于哪个,例如 UserID。然后表格将如下所示:

tblSurveyData

FirstColumn     Second Column      UserID
A0              John               XX001
A2              Smith              XX001
A3              05-01-1973         XX001

然后您可以创建一个初步查询,例如:

Select DISTINCT UserID from tblSurveyData

将其用作您的“指针”查询并循环遍历结果,然后您可以将每个 UserID 的所有记录拉出并将它们复制到新表中。或者,您可以内连接“指针”查询和 tblSurveyData,然后使用交叉表查询。最简单的方法是使用向导创建它,然后将代码复制到您的 VBA 中。

编辑:为了让未来的读者更容易阅读,您在评论中要求的查询的 SQL 是:

SELECT Max(IIf([Identifier]="A0",[IValue],"")) AS FName, Max(IIf([Identifier]="A1",[IValue],"")) AS MName, Max(IIf([Identifier]="A2",[IValue],"")) AS LName, Max(IIf([Identifier]="A3",[IValue],"")) AS BDate FROM tblSurveyData; 

您需要将示例数据中的“第一列”更改为“标识符”,将“第二列”更改为“IValue”(或对上述 SQL 进行相应的字段名称更改)。我已经对此进行了测试,并且效果很好,为您提供了一条记录,其中包含相应字段中的所有 4 个值。将其粘贴到空白查询后,您可以切换到设计视图并将查询更改为 Append 或 MakeTable 查询,这样您就可以将结果导出到 tblSurveyReport。

于 2013-09-04T19:26:20.063 回答