Bueno, básicamente lo que solicitas es una diferencia de conjuntos. Quieres de un conjunto A (t_variacion) todo aquello que no está en B (t_materia_prima_variacion) usando como comparación los ID's de las variaciones. La forma clásica de implementarlo es con un LEFT JOIN.
También puede en este caso implementarse con un INNER JOIN usando como comparación un <>. No es algo usual ya que típicamente se usa un equijoin.
Código:
SELECT v.vari_desc
FROM t_variacion AS v
INNER JOIN t_materia_prima_variacion AS mpv
ON mpv.mtpv_vari_id <> v.vari_id
AND mpv.mtpv_mtpi_id = 1
El segundo query creo que es sintácticamente correcto. No encuentro una razón para que ocurra un error, salvo que alguno de los nombres de las columnas esté mal.
Sin embargo la lógica es simple. Obtienes todas las combinaciones posibles y de estas presentas sólo aquellas que no existan en t_materia_prima_variacion. Es otra diferencia de conjuntos.
No es la única solución y de hecho analizando aún más no es la mejor. Extendiendo el query arriba presentado, puedes obtener para varias materias primas las variaciones faltantes:
Código:
SELECT mp.mtpi_desc, v.vari_desc
FROM t_variacion AS v
INNER JOIN t_materia_prima_variacion AS mpv
ON mpv.mtpv_vari_id <> v.vari_id
INNER JOIN t_materia_prima as mp
ON mp.mtpi_id = mpv.mtpv_mtpi_id
WHERE mp.mtpi_id IN (1,2,3,4)