guardando al volo direi che i campi id dovrebbero essere identici.

ON g.num_prog = a.num_prog
AND g.cod_cons = a.cod_cons

`num_prog` int(10) NOT NULL default '0',
`num_prog` int(6) unsigned zerofill NOT NULL default '000000'

poi quella doppia chiave e' inutile. i record devono essere selezionati in base ad una chiave univoca. Un reference lavora al meglio quando non ha significato nel contenuto della tupla ...

Se num_progr e' univoco a nulla serve la AND con cod_cons e si puo' tranquillamente eliminare. Se invece l'univocita' fosse data da num_prog + cod_cons sarebbe un errore strutturale.

quindi una chiave unica che raccordi le due tabelle con cui prelevare i record da confrontare e poi le eccezioni verranno gestite nel where.