Во-первых, запросы не совпадают.Например, ваш текст SQL содержит восемь столбцов в предложении SELECT
, где версия VBA имеет только три.
Во-вторых, вы используете одно и то же имя таблицы, tblEventLog
, дважды в одной и той же области.Таким образом, вам нужно будет использовать хотя бы одно имя корреляции таблицы.Я знаю, что префикс tbl - это «предмет гордости» в мире доступа, но он делает имена таблиц длиннее и сложнее для чтения IMO (а префиксы специально запрещены стандартом ISO 11179 для элемента данныхnaming:)) ... так почему бы не использовать имена корреляций таблиц повсюду?
В-третьих, IIRC EXISTS
работает лучше, чем IN
для доступа (ACE / Jet / любой другой), и IMO легче понять (DISTINCT..INNER JOIN
может работать даже лучше, но, опять же, его труднее читать, ИМО).
Вот рекомендуемая перезапись:
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.Я продолжаю получать ошибку "Катастрофический сбой".Вот код репро, где я ошибаюсь ?:
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