MS ACCESS запрос - PullRequest
       4

MS ACCESS запрос

0 голосов
/ 03 февраля 2011

Этот запрос не работает из-за двух столбцов в условии Где (tblEventLog.PartNumberChgLvl). Как мне изменить запрос, чтобы решить его?

strNewSql1 = _
    "SELECT DISTINCT " & _
        "tblRevRelLog_Detail.PartNumber, " & _
        "tblRevRelLog_Detail.ChangeLevel " & _
    "FROM tblRevRelLog_Detail LEFT JOIN tblEventLog " & _
        "ON (tblEventLog.PartNumber = tblRevRelLog_Detail.PartNumber) " & _
        "AND (tblEventLog.PartNumberChgLvl " & _
            "= tblRevRelLog_Detail.ChangeLevel) " & _
    "WHERE (tblEventLog.PartNumber, tblEventLog.PartNumberChgLvl) NOT IN " & _
        "(SELECT tblEventLog.PartNumber, tblEventLog.PartNumberChgLvl " & _
        "FROM tblEventLog " & _
        "WHERE tblEventLog.EventTypeSelected = 'pn REMOVED From Wrapper' " & _
            "AND tblEventLog.PartNumber =  tblRevRelLog_Detail.PartNumber " & _
            "AND tblEventLog.PartNumberChgLvl " & _
                "= tblRevRelLog_Detail.ChangeLevel) " & _
        "AND tblEventLog.TrackingNumber = """ & tempTrackingNumber & """ " & _
        "AND tblEventLog.PartNumber =  tblRevRelLog_Detail.PartNumber " & _
        "AND tblEventLog.PartNumberChgLvl =  tblRevRelLog_Detail.ChangeLevel;"

Я показываю это на примере.

пример: давайте возьмем два пакета 1 и 2

пакет 1 имеет номер компонента a-1, b-0, c-1 с уровнями изменения и пакет 2 имеет номер детали a-1, d-1, e-1 с уровнем изменения

если я удаляю «a-1» из пакета 1, он не должен отображаться с этим пакетом, но он должен отображаться с пакетом 2. В этом запросе он также не отображается в пакете 2.

Reviewrelease_Form (основная форма), связанная с рецензируемым релизом:

эта таблица содержит основные данные и номер оболочки

номер оболочки: RevRel_Form (подчиненная форма), связанная с tblRevRelLog_Detail

event_Input - это подчиненная форма, в которую мы вводим события. Когда я выбираю событие, оно отображает номера участников. Это где запрос входит в картину.

Это не должно отображать удаленные номера деталей. Это работает нормально. Но если тот же номер детали с тем же changelevl удаляется из пакета diff .. он также не отображается в текущем пакете.

Ответы [ 3 ]

0 голосов
/ 03 февраля 2011

Можно предположить, что ваш запрос в точке "NOT IN" (т. Е. Его подзапрос) будет эффективно не показывать любой номер детали, если он был удален из любого пакет. Это потому, что этот подзапрос ищет во всех пакетах. Вам нужно будет изменить его (как-то) так, чтобы он учитывал только те строки, которые относятся к интересующему пакету.

Посмотрите внимательно на этот подзапрос. Он помещает условия на номера деталей, уровни изменений и типы событий. Но какие ограничения существуют для пакетов? Как определить, какие строки идут с пакетом 1, а какие - с пакетом 2?

Я предполагаю, что строки из Пакета 1 и Пакета 2 объединены. Так как он находит строку, где «EvtLog.EventTypeSelected = 'pn REMOVED From Wrapper'» равен True хотя бы для одного из этих пакетов, «NOT IN» делает его False независимо от того, пакет, который вы действительно хотели отобразить в программе просмотра событий.


То, что Брэндон S сказал выше (о IN и EXISTS), плюс: вам может понадобиться использовать псевдоним; например (создание псевдонима EvtLog для подзапроса):

"SELECT DISTINCT tblRevRelLog_Detail.PartNumber, tblRevRelLog_Detail.ChangeLevel 
FROM tblRevRelLog_Detail 
LEFT JOIN tblEventLog ON 
    (tblEventLog.PartNumber = tblRevRelLog_Detail.PartNumber) 
    AND (tblEventLog.PartNumberChgLvl = tblRevRelLog_Detail.ChangeLevel)
WHERE NOT EXISTS (SELECT EvtLog.PartNumber, EvtLog.PartNumberChgLvl 
    FROM tblEventLog EvtLog 
    WHERE tblEventLog.PartNumber=EvtLog.PartNumber 
    AND tblEventLog.PartNumberChgLvl=EvtLog.PartNumberChgLvl
    AND EvtLog.EventTypeSelected = 'pn REMOVED From Wrapper' 
    AND EvtLog.PartNumber = tblRevRelLog_Detail.PartNumber 
    AND EvtLog.PartNumberChgLvl = tblRevRelLog_Detail.ChangeLevel) 
AND tblEventLog.TrackingNumber = """ & tempTrackingNumber & """ 
AND tblEventLog.PartNumber = tblRevRelLog_Detail.PartNumber 
AND tblEventLog.PartNumberChgLvl = tblRevRelLog_Detail.ChangeLevel"
0 голосов
/ 03 февраля 2011

Я посмотрел на ваш запрос немного ближе.Я думаю, что ваш запрос может быть более сложным, чем должен быть.

Я думаю, что этот упрощенный запрос может быть тем, к чему вы стремитесь:

SELECT DISTINCT 
   tblRevRelLog_Detail.PartNumber, 
   tblRevRelLog_Detail.ChangeLevel 
FROM tblRevRelLog_Detail 
LEFT JOIN tblEventLog ON 
   (tblEventLog.PartNumber = tblRevRelLog_Detail.PartNumber) AND 
   (tblEventLog.PartNumberChgLvl = tblRevRelLog_Detail.ChangeLevel)
WHERE
   tblEventLog.TrackingNumber = """ & tempTrackingNumber & """
   AND tblEventLog.PartNumber = tblRevRelLog_Detail.PartNumber 
   AND tblEventLog.PartNumberChgLvl = tblRevRelLog_Detail.ChangeLevel;
   AND tblEventLog.EventTypeSelected <> 'pn REMOVED From Wrapper'
0 голосов
/ 03 февраля 2011

Когда вы используете оператор сравнения «IN», вы можете сравнить только одно значение с набором значений.

Таким образом, вам нужно изменить эту часть предложения WHERE на:

WHERE 
tblEventLog.PartNumber NOT IN(SELECT tblEventLog.PartNumber FROM tblEventLog WHERE tblEventLog.EventTypeSelected = 'pn REMOVED From Wrapper'AND tblEventLog.PartNumber = tblRevRelLog_Detail.PartNumber AND tblEventLog.PartNumberChgLvl = tblRevRelLog_Detail.ChangeLevel) and

tblEventLog.PartNumberChgLvl NOT IN(SELECT tblEventLog.PartNumberChgLvl FROM tblEventLog WHERE tblEventLog.EventTypeSelected = 'pn REMOVED From Wrapper'AND tblEventLog.PartNumber = tblRevRelLog_Detail.PartNumber AND tblEventLog.PartNumberChgLvl = tblRevRelLog_Detail.ChangeLevel) 

Но учтите, что выполнение двух из этих «внутренних выборок» (коррелированных подзапросов) может значительно замедлитьвниз по вашему запросу.Возможно, вам лучше использовать объединение со своим «внутренним выбором».

...