consulta do Access retorna campos vazios, dependendo de como a tabela está ligada
-
03-07-2019 - |
Pergunta
Eu tenho um uso Acesso MDB I para relatórios que tem ligado vistas tabela do SQL Server 2005. Eu construí uma consulta que recupera informações fora de uma tabela PO e categoriza o item de linha, dependendo informações de outra tabela. Eu sou relativamente certo a consulta foi bem até cerca de um mês atrás, quando mudou de modo de compatibilidade de 80 a 90 no servidor, conforme exigido pela nossa aplicação primária (que cria os dados). Eu não posso dizer isso com 100% de certeza, mas essa é a única grande mudança feita nos últimos 90 dias. Percebemos que, de repente dados não estava aparecendo na consulta fazer os relatórios olhar estranho.
Esta é uma cópia da consulta falhar:
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")
Ele retorna o seguinte:
jobnum opcode jobseqtype shortchar01 ponum poline unitcost
367000003 S 6624 2 15
A consulta normalmente deveria ter exibido um valor de código de operação e shortchar01. Se eu remover o dbo_podetail tabela ligada,-lo corretamente exibe dados para esses campos (embora eu obviamente não tem unitcost mais). No começo eu pensei que poderia ser um problema de dados, mas eu achei se eu aninhado a consulta e, em seguida, ligada à mesa, ele funcionou bem.
Por exemplo, o seguinte código funciona perfeitamente:
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)
Eu estou em uma perda de por que ela funciona neste último caso e não no primeiro caso. Pior ainda, parece funcionar de forma intermitente durante alguns registros e não para outros (é consistente sobre os que faz e não funciona para).
Algum de vocês especialistas tem alguma idéia?
Solução
Você definitivamente precisa subqueries de uso para múltiplos esquerda / direita se une no Access.
Eu acho que é uma limitação do otimizador Jet que fica confuso se você está apenas encadeamento esquerda / direita junta.
Você pode ver que este é um problema recorrente que as superfícies frequentemente.
Outras dicas
Estou sempre confuso com o uso de suportes na junta de Acesso. Tente extirpando-se os suportes extras.
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)
OK acima não funciona - Desculpe eu desisto