La query di accesso restituisce campi vuoti in base al modo in cui la tabella è collegata
-
03-07-2019 - |
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?
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