Wie bereits in einem anderem Thread mitgeteilt, lässt sich dies mittels Lateral sehr leicht lösen.
Meist hat man ja ein "Gültig Ab" oder "Gültig Bis".

Folglich gibts 2 Varianten:

Code:
select a.menge, b.preis, a.PreisDatum
 from AuftragsPosition a
cross join lateral (
  select Preis from PreisTabelle b
   where a.Artikel = b.Artikel and a.Preisdatum >= b.GueltigAb
    order by Artikel, GueltigAb asc
    fetch first 1 rows only
) b

select a.menge, b.preis, a.PreisDatum
 from AuftragsPosition a
cross join lateral (
  select Preis from PreisTabelle b
   where a.Artikel = b.Artikel and a.Preisdatum <= b.GueltigBis
    order by Artikel, GueltigBis desc
    fetch first 1 rows only
) b
Theoretisch könnte man auch 2 Cross-Joins zusammen verwenden und per coalesce(b1.Preis, b2.Preis) prüfen:
Wenn kein aktueller Preis (b1) dann nimm den letzten vorhandenen Preis (b2).