Le problème est qu'Oracle ne sait pas que get_fiscal_year_start_date (SYSDATE)
renvoie un seul résultat. Il suppose donc qu'il générera beaucoup de lignes.
Évidemment, je n'ai pas de harnais de test à portée de main, mais cette version de votre requête devrait bannir la jointure cartésienne de fusion.
SELECT RTRIM (position) AS "POSITION",
. // Other fields
.
.
FROM schema.table x
, ( select get_fiscal_year_start_date (SYSDATE) as fiscal_year
from dual ) fy
WHERE hours > 0
AND pay = 'RGW'
AND NOT EXISTS( SELECT position
FROM schema.table2 y
where y.date = fy.fiscal_year
AND y.position = x.position )
Oracle sait que DUAL a une seule ligne, et donc que la sous-requête renverra une valeur.