I would strongly urge you to copy the price from the schedule directly to Purchase as soon as you're inserting that. That way, you have solved your problem, and at the same time, prevented from a different price being charged to the customer later on if you accidentally (or intentionally) change the schedule.
As for relating to the primary key of schedule, and this not being traceable from a transation: that is a sign of bad design. I mean, think about it - you have a timestamp in transaction, a schedule by definition is placed in time using a from and to timestamp - why can't you relate them? AFAICS, primary key of schedule should be item_id, from_timestamp, to_timestamp
Assuming your schedule table has a from and to timestamp My query would be
SELECT ..your columns..
FROM Transaction t
INNER JOIN Purchase p
ON t.id = p.transaction_id
INNER JOIN Item i
ON p.id = i.purchase_id
INNER JOIN Schedule s
ON i.id = s.item_id
AND t.timestamp BETWEEN s.from_timestamp
AND s.to_timestamp
As for, should you use a view or not - really, it's up to you. A view does not work better or worse than a query, the only difference is that the definition is stored in the database. The main advantages of that are
- people can reuse the definition without copying the query (and messing it up), the
- you can change the schema to some extent and hide that from the application provided you update the view accordingly (this latter advantage is often overestimated)