MS Access VBA中的SQL查询

时间:2010-11-10 17:33:13

标签: sql ms-access vba ms-access-2003

表单数据记录源中的此查询工作正常,返回我想要的确切值

SELECT tblRevRelLog_Detail.RevRelTrackingNumber, tblRevRelLog_Detail.PartNumber, tblRevRelLog_Detail.ChangeLevel, tblRevRelLog_Detail.Version, tblRevRelLog_Detail.JobPnType, tblRevRelLog_Detail.EdsName, tblRevRelLog_Detail.DetailerNamePerPartNumber, tblRevRelLog_Detail.DetailerCompanyPerPartNumber
FROM tblRevRelLog_Detail 
LEFT JOIN tblEventLog ON tblRevRelLog_Detail.PartNumber = tblEventLog.PartNumber
WHERE (((tblEventLog.PartNumber) Not In 
    (SELECT tblEventLog.PartNumber 
     FROM tblEventLog 
     WHERE tblEventLog.EventTypeSelected = 'pn REMOVED From Wrapper' 
         AND tblEventLog.TrackingNumber =  tblRevRelLog_Detail.RevRelTrackingNumber)))
ORDER BY tblRevRelLog_Detail.PartNumber;

但是如果我在VBA中编写相同的查询。它没有返回任何内容

strNewSql = "SELECT tblRevRelLog_Detail.PartNumber, tblRevRelLog_Detail.ChangeLevel, tblRevRelLog_Detail.ID FROM tblRevRelLog_Detail LEFT JOIN tblEventLog ON tblRevRelLog_Detail.PartNumber = tblEventLog.PartNumber"
strNewSql = strNewSql & " WHERE ((tblEventLog.PartNumber) Not In (SELECT tblEventLog.PartNumber FROM tblEventLog WHERE tblEventLog.EventTypeSelected = 'pn REMOVED From Wrapper' AND tblEventLog.TrackingNumber =  tblRevRelLog_Detail.RevRelTrackingNumber);"

查询有问题?有人可以帮帮我!

5 个答案:

答案 0 :(得分:0)

我怀疑你的变量tempTrackingNumber是坏的

答案 1 :(得分:0)

如果RevRelTrackingNumber是数字,则无需将其括在引号中。

答案 2 :(得分:0)

tempTrackingNumber的数据类型是什么?您的代码(前截断)显示了这个:

...tblRevRelLog_Detail.RevRelTrackingNumber = """ & tempTrackingNumber & """);"

这意味着它是一个字符串,它将被视为这样。

如果它实际上是数字,那么你会想要这个:

...tblRevRelLog_Detail.RevRelTrackingNumber = " & tempTrackingNumber & ");"

答案 3 :(得分:0)

首先,查询不一样。例如,您的纯文本SQL在SELECT子句中有八列,其中VBA版本只有三列。

其次,您在同一范围内使用相同的表名tblEventLog两次。因此,您需要使用至少一个表关联名称。我知道tbl-前缀是Access世界中的“自豪点”,但它确实会让你的表名更长,更难以阅读IMO(ISO 11179 Standard特别禁止前缀用于数据元素命名:)) ...为什么不在整个过程中使用表格相关名称?

第三,IIRC EXISTS的性能优于IN用于访问(ACE / Jet /无论如何),IMO更容易理解(DISTINCT..INNER JOIN可能表现更好但又难以阅读,IMO)。

这是建议的重写:

SELECT D1.PartNumber, D1.ChangeLevel, 
       D1.ID 
  FROM tblRevRelLog_Detail AS D1
       LEFT OUTER JOIN tblEventLog AS E1
          ON D1.PartNumber = E1.PartNumber 
 WHERE NOT EXISTS (
                   SELECT *
                     FROM tblEventLog AS E2 
                    WHERE E2.EventTypeSelected = 'pn REMOVED From Wrapper' 
                          AND E2.TrackingNumber = D1.RevRelTrackingNumber
                          AND E2.PartNumber = E1.PartNumber
                  ); 

更新:似乎我错误地认为EXIST给予更好,所以这里有一些更改可供选择:

SELECT D1.PartNumber, D1.ChangeLevel, 
       D1.ID 
  FROM tblRevRelLog_Detail AS D1
       LEFT OUTER JOIN tblEventLog AS E1
          ON D1.PartNumber = E1.PartNumber 
 WHERE E1.PartNumber NOT IN 
       (
        SELECT E2.PartNumber
          FROM tblEventLog AS E2 
         WHERE E2.EventTypeSelected = 'pn REMOVED From Wrapper' 
               AND E2.TrackingNumber = D1.RevRelTrackingNumber
       ); 

实际上,我正在努力使用Access的专有连接进行重写。我不断遇到“灾难性故障”错误。这是repro代码,我哪里错了?:

Sub grjieopgj()

  On Error Resume Next
  Kill Environ$("temp") & "\DropMe.mdb"
  On Error GoTo 0

  Dim cat
  Set cat = CreateObject("ADOX.Catalog")
  With cat
    .Create _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & _
        Environ$("temp") & "\DropMe.mdb"
    With .ActiveConnection

      Dim Sql As String
      Sql = _
      "CREATE TABLE tblRevRelLog_Detail " & vbCr & "(" & vbCr & _
      " PartNumber VARCHAR(20), " & vbCr & " EventTypeSelected VARCHAR(20), " & vbCr & _
      " TrackingNumber VARCHAR(20), " & vbCr & " RevRelTrackingNumber VARCHAR(20), " & vbCr & _
      " ChangeLevel VARCHAR(20), ID VARCHAR(20)" & vbCr & ");"
      .Execute Sql

      Sql = _
      "CREATE TABLE tblEventLog " & vbCr & "(" & vbCr & _
      " PartNumber VARCHAR(20), " & vbCr & " EventTypeSelected VARCHAR(20), " & vbCr & _
      " TrackingNumber VARCHAR(20), " & vbCr & " RevRelTrackingNumber VARCHAR(20), " & vbCr & _
      " ChangeLevel VARCHAR(20), ID VARCHAR(20)" & vbCr & ");"

      Sql = _
      "SELECT DISTINCT D1.PartNumber, D1.ChangeLevel," & _
      " " & vbCr & "       D1.ID " & vbCr & "  FROM (" & vbCr & "        tblRevRelLog_Detail" & _
      " AS D1" & vbCr & "        LEFT OUTER JOIN tblEventLog" & _
      " AS E1" & vbCr & "          ON D1.PartNumber = E1.PartNumber" & vbCr & "" & _
      "       )" & vbCr & "       LEFT OUTER JOIN tblEventLog" & _
      " AS E2" & vbCr & "          ON AND E2.TrackingNumber" & _
      " <> D1.RevRelTrackingNumber" & vbCr & "           " & _
      "  AND E2.PartNumber <> E1.PartNumber" & vbCr & " WHERE" & _
      " E2.EventTypeSelected = 'pn REMOVED From" & _
      " Wrapper';"

      Dim rs
      Set rs = .Execute(Sql)
      MsgBox rs.GetString
    End With
    Set .ActiveConnection = Nothing
  End With
End Sub

答案 4 :(得分:0)

好像你错过了一个结束括号。在VBA中的查询末尾添加“)”并尝试。