Custom report type object joins
Key Takeaway
Each relationship in a custom report type has a criterion that controls which parent records appear. The must-have option includes only parent records that have child records, and the may-or-may-not option includes parent records whether or not they have child records. After you choose the may-or-may-not option, all later relationships use it too.
A custom report type defines which objects a report can pull data from and how those objects are joined. You pick a primary object, relate other objects to it, and choose whether parent records with no related child records still appear. Custom report types give you more flexibility with object relationships and expand the data available to report users.
Starting with a primary object
Every custom report type starts with a primary object. You can build a custom report type on any object, even one you don't have permission to view. To create and update custom report types, you need the "Manage Custom Report Types" permission.
After you save the custom report type, you can't change the primary object, so choose it carefully.