繁体   English   中英

MS Access VBA中的SQL查询

[英]SQL Query in MS Access VBA

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

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);"

查询出问题了吗? 有人能帮我吗!

我怀疑您的变量tempTrackingNumber不好

如果RevRelTrackingNumber为数字,则无需将其用引号引起来。

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

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

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

如果它实际上是数字,那么您将需要它:

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

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

其次,在同一作用域中两次使用相同的表名tblEventLog 因此,您将需要至少使用一个表相关名称。 我知道tbl-前缀是Access世界中的一个“骄傲点”,但这确实使您的表名更长,更难阅读IMO(并且前缀对于数据元素命名特别受ISO 11179标准的禁止:)。 。那么为什么不使用表相关名称呢?

第三,IIRC EXISTS性能要比IN for Access(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

好像您缺少右括号。 在VBA的查询末尾添加“)”,然后尝试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM