1

我想在 mailers 表中创建一条新记录,其中三个字段将包含值:contacts_first_filter_id、mailer_states_id、created_at。其中两个值基于来自其他表的查询,最后一个值只是当前时间。

我尝试了多种方法来实现这一点,但没有一个奏效。首先,我尝试直接在 sql 设计中创建查询:

INSERT INTO mailers ( contacts_first_filter_id, mailer_states_id, created_at )
VALUES (DLookup("id","update_mailer_step_two"), DLookup("id","mailer_states" & "mailer_state = 'sent'"), Now());

这给出了错误“未知”。

我还尝试将其放入 VBA 编辑器并在单击按钮时触发它:

Private Sub Command6_Click()


        Dim CFF_ID As String, MS_ID As String, strSQL As String

        CFF_ID = "SELECT update_mailer_step_two.id FROM update_mailer_step_two"

        MS_ID = "SELECT mailer_states.id FROM mailer_states WHERE mailer_states.mailer_state = 'sent'"

        strSQL = "INSERT INTO mailers ( contacts_first_filter_id, mailer_states_id, created_at )VALUES ((" & CFF_ID & "),(" & MS_ID & "),NOW())"

        DoCmd.RunSQL strSQL

End Sub

这会产生错误:“查询输入必须包含至少一个表或查询”。

我使用 INNER JOIN 尝试了以下建议,但是虽然这不会产生错误,但它会附加 0 行,大概是因为 update_mailer_step_two 和 mailer_states 之间没有 INNER JOIN 链接:

INSERT INTO mailers ( contacts_first_filter_id, mailer_states_id, created_at )
SELECT update_mailer_step_two.id, mailer_states.id, Now()
FROM update_mailer_step_two INNER JOIN mailer_states ON update_mailer_step_two.id = mailer_states.ID
WHERE mailer_states.mailer_state = 'sent';

mailer_states 表只是一个包含带有文本的 mailer_state 字段的表。它几乎只是一个永远不会改变的查找表。

update_mailer_step_2 包含一个名为 id 的字段,其中包含一堆与数据库中的联系人相关联的 id。因此,mailer_states 和 update_mailer_step_2 之间根本没有任何关系。

** 我认为我能够做的是,当我创建 update_mailer_step_two 时,添加一个新列并将其默认为对应于 mailer_states 的值,以便 INNER JOIN 可以工作。不幸的是,您似乎无法在 Access 中执行此操作!

另一个stackoverflow帖子提到您可以:

SQL 添加具有默认值的列 - Access 2003

但这对我不起作用。

我已经没有关于如何将基于其他表的查询作为查询的值放置的想法,该查询旨在在表中创建新记录。

感谢您的回复。

4

4 回答 4

3

在即时窗口 (Ctrl+g) 中尝试您的 2 个 DLookup 语句。

? DLookup("id","update_mailer_step_two")
? DLookup("id","mailer_states", "mailer_state = 'sent'")

如果它们有效(不要抛出错误)并返回您想要的内容,请尝试将它们合并到您的子例程中。

Private Sub Command6_Click()
    Dim CFF_ID As Long, MS_ID As Long, strSQL As String
    Dim db As DAO.Database
    CFF_ID = DLookup("id","update_mailer_step_two")
    MS_ID = DLookup("id","mailer_states", "mailer_state = 'sent'")
    strSQL = "INSERT INTO mailers (contacts_first_filter_id, mailer_states_id, created_at) " & _
        "VALUES (" & CFF_ID & ", " & MS_ID & ", NOW())"
    'DoCmd.RunSQL strSQL '
    Debug.Print strSQL 'look in Immediate Window to see the completed INSERT statement '
    Set db = CurrentDb
    db.Execute strSQL, dbFailOnError
    Set db = Nothing
End Sub

该未经测试的代码假定 CFF_ID、MS_ID、邮件程序中的 contacts_first_filter_id 和 mailer_states_id 字段以及 update_mailer_step_two 和 mailer_states 表中的 id 字段的数字数据类型。如果其中任何一个实际上是文本,则您必须对代码进行调整或告诉我们哪个是哪个。

编辑: Debug.Print 行的目的是允许您查看您要求数据库执行的完整 INSERT 语句。如果失败,您可以复制语句文本并将其粘贴到新查询的 SQL 视图中。在那里您可以对其进行调整,以便 Access 接受它。然后调整您的代码以生成相同的工作 INSERT 语句。

于 2011-02-01T02:13:25.907 回答
3

您的第一种方法(使用包含对 DLookup 的调用的查询)原则上应该有效,但它有语法错误。@HansUp 建议单独运行每个 DLookup 是一个很好的建议,可以帮助您识别这一点(在 Visual Basic 编辑器中,按 Ctrl-G 显示中间窗口;@HansUp 示例中每个表达式前的问号必需的)。

具体来说,第二个 DLookup 调用中的 & 号是字符串连接字符,这意味着您当前的调用相当于:

DLookup("id","mailer_statesmailer_state = 'sent'")

相反,将其更改为:

DLookup("id","mailer_states", "mailer_state = 'sent'")


额外的

要为 update_mailer_step_two 中的每一行插入一个新行,请尝试以下操作:

INSERT INTO mailers ( contacts_first_filter_id, mailer_states_id, created_at )
SELECT update_mailer_step_two.id,
       DLookup("id","mailer_states", "mailer_state = 'sent'"),
       Now()
FROM update_mailer_step_two
于 2011-02-01T06:33:19.470 回答
0

您正在尝试将 select 语句的结果插入到表中。但是,select 语句独立地从两个不同的表中进行选择。

我认为这行不通。

主要是因为它如何处理两个独立的结果。它是否创建一个包含交叉、内部连接等的列表?

我将创建一个从两者中进行选择的查询,然后将该查询插入到您的表中。或者您可以内部加入选择并将该加入转发到您的值中。

于 2011-01-31T23:14:09.687 回答
0

我认为您的按钮单击示例在构建字符串时也存在语法错误。这应该可以工作(使用其余代码,假设您的 DLoookups 正常工作,如 HansUp 所述):

strSql = "INSERT INTO mailers (contacts_first_filter_id,  mailer_states_id," & _
       " created_at) VALUES (" & CFF_ID & ", " & MS_ID & ", #" & Now() & "#)"

我不确定我删除的额外括号是否会产生任何影响,并且空白空间差异应该没有区别,但我的版本允许 VBA 评估Now()并将值构建到字符串中。Access 用于#引用日期。

于 2011-02-01T18:25:53.683 回答