У меня есть 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)
Я в недоумении, почему это работает в последнем случае, а не в первом. Хуже того, кажется, что он работает с перебоями для некоторых записей, а не для других (он согласуется с теми, для которых он работает, и для которых он не работает).
У кого-нибудь из вас есть какие-нибудь идеи?