large SQL Performing quite slow (roughly 2 seconds for 290 rows) when having to deal with entries that can be NULL
Use DISTINCT everywhere you can and I don't understand why not to join instead of correlating

                 SELECT psc 
                 FROM   pso_history AS c 
                 WHERE  ( c.project = 121 
                           OR c.project IS NULL ) 
                 AND EXISTS (SELECT * FROM   pso_history AS x 
                                    WHERE  x.project = 121 
                                    AND x.pso_id = c.pso_id )


                 SELECT DISTINCT c.psc
                 FROM pso_history AS c
                 JOIN pso_history AS x 
                 ON      ( c.project = 121 OR c.project IS NULL )
                    AND   x.project = 121 
                    AND   x.pso_id = c.pso_id


And the entire query will be

SELECT  xyx.version_stamp, xyx.pscdesc_id, xyx.psc, xyx.pscdesctext 
FROM    pscdesc_history AS xyx
JOIN    pscdesc_history AS xyy
ON  (xyx.psc IN (SELECT DISTINCT c.psc
                 FROM pso_history AS c
                 JOIN pso_history AS X 
                 ON      ( c.project = 121 OR c.project IS NULL )
                    AND   x.project = 121 
                    AND   x.pso_id = c.pso_id) 
     OR xyx.psc IS NULL)
AND xyy.pscdesc_id = xyx.pscdesc_id
AND  xyy.psc IN ( SELECT DISTINCT c.psc
                 FROM pso_history AS c
                 JOIN pso_history AS X 
                 ON      ( c.project = 121 OR c.project IS NULL )
                    AND   x.project = 121 
                    AND   x.pso_id = c.pso_id)


This must work twice farster I think, check the indexes also.