Domanda

Ho un MDB di Access che uso per i report che ha collegato le viste di tabella da SQL Server 2005. Ho creato una query che recupera le informazioni da una tabella PO e classifica l'elemento pubblicitario in base alle informazioni di un'altra tabella. Sono relativamente certo che la query andava bene fino a circa un mese fa quando siamo passati dalla modalità di compatibilità 80 a 90 sul Server come richiesto dalla nostra applicazione principale (che crea i dati). Non posso dirlo con certezza al 100%, ma questo è l'unico grande cambiamento fatto negli ultimi 90 giorni. Abbiamo notato che improvvisamente i dati non venivano visualizzati nella query, rendendo i rapporti apparenti strani.

Questa è una copia della query non riuscita:

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")

Restituisce il seguente:

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


La query normalmente dovrebbe aver visualizzato un valore per opcode e shortchar01. Se rimuovo la tabella collegata dbo_podetail, visualizza correttamente i dati per questi campi (anche se ovviamente non ho più unitcost). All'inizio ho pensato che potesse trattarsi di un problema di dati, ma ho scoperto che se annidavo la query e poi collegavo la tabella, funzionava bene.

Ad esempio il seguente codice funziona perfettamente:

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)

Sono in perdita per il motivo per cui funziona in quest'ultimo caso e non nel primo caso. Peggio ancora, sembra funzionare in modo intermittente per alcuni dischi e non per altri (è coerente con quelli per cui funziona e per cui non funziona).

Qualcuno di voi esperti ha qualche idea?

È stato utile?

Soluzione

È assolutamente necessario utilizzare le subquery per più join sinistra / destra in Access.
Penso che sia una limitazione dell'ottimizzatore Jet che viene confuso se si stanno semplicemente concatenando join sinistra / destra.

Puoi vedere che si tratta di un problema ricorrente che emerge spesso.

Altri suggerimenti

Sono sempre confuso dall'uso di Access tra parentesi nei join. Prova a eliminare le parentesi extra.

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, quanto sopra non funziona - Scusa, mi arrendo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top