How to (a) rewrite a query that JOINs three tables and (b) make its execution more efficient
My first impression is that you should redesign your tables a bit. I'm not sure what SPLIT_PART does, but it sounds as if it grabs part of a string, and having such functions in an ON clause is really bad for performance. Assume table A and B has 1000 rows each:

SELECT ...
FROM A
JOIN B
    ON f(A.x) = f(B.x)


In a nested loop join there will be 2*1000*1000=2 miljon calls to f. I would investigate the possibilities to add a generated column for the join conditions, and add an index.

To remove redundancy from the answer you can use distinct, but you will still get redundant info in the following situation:

GOLD, SILVER, ...
SILVER, GOLD, ...


Does it matter if a_commodity and b_commodity switches place for a certain row? If not you can arrange the in lexigraphical order like:

SELECT distinct
       LEAST(minfac.mineral_commodity_general, outlook.commodity, table2.commodity)
     , ...
       GREATEST(minfac.mineral_commodity_general, outlook.commodity, table2.commodity)
     , ...


For the middlest one you will have to exclude the least and the greatest one.