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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top