Запрос доступа возвращает пустые поля в зависимости от того, как таблица связана - PullRequest
3 голосов
/ 05 марта 2009

У меня есть Access MDB, который я использую для отчетов, который связал представления таблиц из SQL Server 2005. Я создал запрос, который извлекает информацию из таблицы PO и классифицирует позицию в зависимости от информации из другой таблицы. Я относительно уверен, что запрос был в порядке, пока примерно месяц назад мы не перешли с режима совместимости 80 на 90 на сервере, как того требует наше основное приложение (которое создает данные). Я не могу сказать это со 100% уверенностью, но это единственное серьезное изменение, сделанное за последние 90 дней. Мы заметили, что внезапно данные не отображаются в запросе, что делает отчеты странными.

Это копия ошибочного запроса:

SELECT dbo_porel.jobnum, dbo_joboper.opcode, dbo_porel.jobseqtype,
    dbo_opmaster.shortchar01, 
    dbo_porel.ponum, dbo_porel.poline, dbo_podetail.unitcost

FROM ((dbo_porel 
LEFT JOIN dbo_joboper ON (dbo_porel.assemblyseq = dbo_joboper.assemblyseq) 
    AND (dbo_porel.jobseq = dbo_joboper.oprseq) 
    AND (dbo_porel.jobnum = dbo_joboper.jobnum)) 
LEFT JOIN dbo_opmaster ON dbo_joboper.opcode = dbo_opmaster.opcode) 
LEFT JOIN dbo_podetail ON (dbo_porel.poline = dbo_podetail.poline) 
    AND (dbo_porel.ponum = dbo_podetail.ponum)

WHERE (dbo_porel.jobnum="367000003")

Возвращает следующее:

jobnum    opcode  jobseqtype  shortchar01  ponum  poline  unitcost
367000003            S                     6624       2      15


В запросе обычно должно отображаться значение для кода операции и shortchar01. Если я удаляю связанную таблицу dbo_podetail, она правильно отображает данные для этих полей (хотя у меня, очевидно, больше нет unitcost). Сначала я подумал, что это может быть проблема с данными, но я обнаружил, что если я вложил запрос, а затем связал таблицу, он работал нормально.

Например, следующий код работает отлично:

SELECT qryTest.*, dbo_podetail.unitcost

FROM (

    SELECT dbo_porel.jobnum, dbo_joboper.opcode, dbo_porel.jobseqtype,
        dbo_opmaster.shortchar01, dbo_porel.ponum, dbo_porel.poline

    FROM (dbo_porel 
    LEFT JOIN dbo_joboper ON (dbo_porel.jobnum=dbo_joboper.jobnum) 
        AND (dbo_porel.jobseq=dbo_joboper.oprseq) 
        AND (dbo_porel.assemblyseq=dbo_joboper.assemblyseq)) 
    LEFT JOIN dbo_opmaster ON dbo_joboper.opcode=dbo_opmaster.opcode

    WHERE (dbo_porel.jobnum="367000003")

) As qryTest 
LEFT JOIN dbo_podetail ON (qryTest.poline = dbo_podetail.poline) 
    AND (qryTest.ponum = dbo_podetail.ponum)


Я в недоумении, почему это работает в последнем случае, а не в первом. Хуже того, кажется, что он работает с перебоями для некоторых записей, а не для других (он согласуется с теми, для которых он работает, и для которых он не работает).

У кого-нибудь из вас есть какие-нибудь идеи?

Ответы [ 2 ]

1 голос
/ 06 марта 2009

Вам определенно нужно использовать подзапросы для нескольких левых / правых объединений в Access.
Я думаю, что это ограничение оптимизатора Jet, которое запутывается, если вы просто соединяете левые / правые объединения.

Вы можете увидеть, что это постоянная проблема , которая часто возникает.

0 голосов
/ 05 марта 2009

Меня всегда смущает использование Access скобок в соединениях. Попробуйте убрать лишние скобки.

FROM 
    dbo_porel 
LEFT JOIN 
    dbo_joboper ON (dbo_porel.assemblyseq = dbo_joboper.assemblyseq) 
        AND (dbo_porel.jobseq = dbo_joboper.oprseq) 
        AND (dbo_porel.jobnum = dbo_joboper.jobnum)
LEFT JOIN 
    dbo_opmaster ON (dbo_joboper.opcode = dbo_opmaster.opcode)
LEFT JOIN 
    dbo_podetail ON (dbo_porel.poline = dbo_podetail.poline) 
        AND (dbo_porel.ponum = dbo_podetail.ponum)

ОК, вышесказанное не работает - извините, я сдаюсь

...