我目前有以下MS Access SQL查询,它是AccessVBA函数的一部分。它是在上一个问题的帮助下构建的,您可以查看该问题以更好地了解其工作原理。
sqlJoinQuery = "SELECT tbl_grp_by.[Field1],tbl_grp_by.[Field2], " & _ "Switch( " & _ "Nz(tbl_grp_by.[maxfield3]) = 0, '0', " & _ "Nz(tbl_grp_by.[maxfield3]) = 1, '>1 million', " & _ "Nz(tbl_grp_by.[maxfield3]) = 2, '0001-0010' " & _ ") as [Field3], " & _ "tbl_grp_by.[" + commonField + "], " & _ "[" + tableName + "].* " & _ "INTO [" + newTableName + "] FROM (" & _ "SELECT Max([" + tableNameTemp + "].[Field1]) as [Field1], " & _ "Max([" + tableNameTemp + "].[Field2]) as [Field2], " & _ "Max(Switch( " & _ "Nz([" + tableNameTemp + "].[Field3]) = '0' , 0, " & _ "Nz([" + tableNameTemp + "].[Field3]) = '>1 million' , 1, " & _ "Nz([" + tableNameTemp + "].[Field3]) = '0001-0010', 2 " & _ "))as [maxField3], " & _ "[" + tableNameTemp + "].[" + commonField + "] as [" + commonField + "] " & _ "FROM [" + tableNameTemp + "] " & _ "INNER JOIN [" + tableName + "] " & _ "ON [" + tableNameTemp + "].[" + commonField + "] = [" + tableName + "].[" + commonField + "] " & _ "GROUP BY [" + tableNameTemp + "].[" + commonField + "] " & _ ") as tbl_grp_by " & _ "INNER JOIN [" + tableName + "] " & _ "ON [" + tableName + "].[" + commonField + "] = tbl_grp_by.[" + commonField + "]"
上面的Access查询产生以下SQL字符串:
SELECT tbl_grp_by.[Field1], tbl_grp_by.[Field2], Switch(Nz(tbl_grp_by.[maxfield3]) = 0, '0', Nz(tbl_grp_by.[maxfield3]) = 1, '>1 million', Nz(tbl_grp_by.[maxfield3]) = 2, '0001-0010') AS [Field3], tbl_grp_by.[Finding ID], [Issue_Management_Findings].* INTO [region_Issue_Management_Findings] FROM (SELECT Max([temp2_temp_Issue_Management_Findings].[Field1]) AS [Field1], Max([temp2_temp_Issue_Management_Findings].[Field2]) AS [Field2], Max(Switch(Nz([temp2_temp_Issue_Management_Findings].[Field3]) = '0', 0, Nz([temp2_temp_Issue_Management_Findings].[Field3]) = '>1 million', 1, Nz([temp2_temp_Issue_Management_Findings].[Field3]) = '0001-0010', 2))AS [maxField3], [temp2_temp_Issue_Management_Findings].[Finding ID] AS [Finding ID] FROM [temp2_temp_Issue_Management_Findings] INNER JOIN [Issue_Management_Findings] ON Nz([temp2_temp_Issue_Management_Findings].[Finding ID]) = Nz([Issue_Management_Findings].[Finding ID]) GROUP BY [temp2_temp_Issue_Management_Findings].[Finding ID]) AS tbl_grp_by INNER JOIN [Issue_Management_Findings] ON Nz([Issue_Management_Findings].[Finding ID]) = Nz(tbl_grp_by.[Finding ID])
因此[Field3]在内部查询中的max()下编码,而在外部查询中的max解码。
但是,当我运行它时,出现以下错误:
运行时错误“ 3464”:条件表达式中的数据类型不匹配
如果我从即时窗口的调试输出中复制我的SQL查询并将其粘贴到手动SQL查询中(在将我的VBA代码运行到应该在其中运行SQL查询的断点之后),那么我会收到以下错误消息:
条件表达式中的数据类型不匹配
如果我仅在上述SQL字符串中运行子查询以进行调试,请执行以下操作:
(SELECT Max([temp2_temp_Issue_Management_Findings].[Field1]) AS [Field1], Max([temp2_temp_Issue_Management_Findings].[Field2]) AS [Field2], Max(Switch(Nz([temp2_temp_Issue_Management_Findings].[Field3]) = '0', 0, Nz([temp2_temp_Issue_Management_Findings].[Field3]) = '>1 million', 1, Nz([temp2_temp_Issue_Management_Findings].[Field3]) = '0001-0010', 2))AS [maxField3], [temp2_temp_Issue_Management_Findings].[Finding ID] AS [Finding ID] FROM [temp2_temp_Issue_Management_Findings] INNER JOIN [Issue_Management_Findings] ON Nz([temp2_temp_Issue_Management_Findings].[Finding ID]) = Nz([Issue_Management_Findings].[Finding ID]) GROUP BY [temp2_temp_Issue_Management_Findings].[Finding ID])
然后它运行没有错误
请注意, Issue_Management_Findings 是数据库中现有表的名称。
有人知道我该如何解决这些错误?
我认为您必须在默认值上添加默认返回值,Switch以防万一它不符合其他所有条件,因此不会返回Null,我认为是造成此Data Type mismatch问题的原因。您可以添加...,true,"thedefaultvalue")例如
Switch
Null
Data Type mismatch
...,true,"thedefaultvalue")
SWITCH (field>100, "greater", field3=100 ,"equals", true, "default")
所以在您的查询中。我默认为0;
0
sqlJoinQuery = "SELECT tbl_grp_by.[Field1],tbl_grp_by.[Field2], " & _ "Switch( " & _ "Nz(tbl_grp_by.[maxfield3]) = 0, '0', " & _ "Nz(tbl_grp_by.[maxfield3]) = 1, '>1 million', " & _ "Nz(tbl_grp_by.[maxfield3]) = 2, '0001-0010' " & _ ", true,'0') as [Field3], " & _ "tbl_grp_by.[" + commonField + "], " & _ "[" + tableName + "].* " & _ "INTO [" + newTableName + "] FROM (" & _ "SELECT Max([" + tableNameTemp + "].[Field1]) as [Field1], " & _ "Max([" + tableNameTemp + "].[Field2]) as [Field2], " & _ "Max(Switch( " & _ "Nz([" + tableNameTemp + "].[Field3]) = '0' , 0, " & _ "Nz([" + tableNameTemp + "].[Field3]) = '>1 million' , 1, " & _ "Nz([" + tableNameTemp + "].[Field3]) = '0001-0010', 2 " & _ ", true, 0))as [maxField3], " & _ "[" + tableNameTemp + "].[" + commonField + "] as [" + commonField + "] " & _ "FROM [" + tableNameTemp + "] " & _ "INNER JOIN [" + tableName + "] " & _ "ON [" + tableNameTemp + "].[" + commonField + "] = [" + tableName + "].[" + commonField + "] " & _ "GROUP BY [" + tableNameTemp + "].[" + commonField + "] " & _ ") as tbl_grp_by " & _ "INNER JOIN [" + tableName + "] " & _ "ON [" + tableName + "].[" + commonField + "] = tbl_grp_by.[" + commonField + "]"