In the world of databases, a join is a method to combine data from two or more tables based on a relationship between them. This concept is fundamental to reporting because most meaningful information is spread across multiple tables.
In Oracle Fusion, this is especially true. Whether you are working with HCM, Financials, or SCM modules, the data resides in hundreds of interrelated tables. To generate insights or build reports, you must understand how to effectively join tables. Writing SQL in Fusion almost always involves joins, making it essential to understand not just the syntax, but also the nuances and pitfalls.
In this blog, we will explore the types of joins, their functionality in Fusion reporting, and best practices for utilizing them efficiently. Many developers also refer to these as Oracle Fusion joins when designing data models in reports.
Basics of Joins in Oracle Database
Before diving into specific joins, it is essential to understand that a join is a method for combining rows from two or more tables based on a related column. In Oracle Fusion, understanding the different types of joins enables you to retrieve accurate data and prevent missing or duplicated information.
Each join type serves a specific purpose depending on the relationship between tables and the report requirements. Professionals often group these under Oracle Fusion joins for simplicity when documenting SQL queries.
Here are the main join types you will encounter in Oracle Database and Oracle Fusion reporting:
| Join Type | Description | Use case |
| INNER JOIN | Returns only the rows that have matching values in both tables | Fetch employees who have active assignments |
| LEFT OUTER JOIN | Returns all rows from the left table, and matched rows from the right table. If there is no match, NULLs are returned. | List all employees, even if some do not have assignments |
| RIGHT OUTER JOIN | Returns all rows from the right table, and matched rows from the left table. If there is no match, NULLs are returned. | List all departments, even if no employees belong to them |
| FULL OUTER JOIN | Returns all rows from both tables. Matched rows are combined; unmatched rows appear with NULLs in the missing side | Show all employees and all departments, including those without a match |
| SELF JOIN | Joins a table with itself, using aliases to differentiate rows | Find employee–manager relationships or hierarchical reporting structures |
| CROSS JOIN / CARTESIAN JOIN | Returns every combination of rows between two tables. | Rarely used; sometimes for generating combinations or matrix reports |
Oracle Join Optimization: Oracle’s optimizer determines the most efficient join order based on indexes, join conditions, and table statistics. Proper indexing and well-defined join predicates help improve query performance. The same logic applies when tuning Oracle Fusion joins for better runtime efficiency.
You May Read: Oracle Fusion Data Model & Table Structure Overview
How Oracle Fusion Joins Work in Oracle Fusion Reporting / Analytics Layer?
In Oracle Fusion, the way joins work depends on the specific reporting tool used. In Oracle Transactional Business Intelligence (OTBI), many tables and views have predefined relationships, known as automatic joins. This means that developers rarely need to write SQL manually; the system automatically knows how the tables relate.
Automatic joins save time and reduce errors because the report developer can select fields from related tables, and the system applies the correct join behind the scenes.
Example: Suppose you are building an HR report and want to show employee names along with their current assignment. In the HCM subject area, the tables PER_ALL_PEOPLE_F (employees) and PER_ALL_ASSIGNMENTS_F (assignments) already have an automatic join on PERSON_ID.
In OTBI, you can drag fields from both tables into your report, and the system automatically applies the join, producing output like:
| Person Number | Assignment Number | Assignment Start Date |
| 1001 | 1001E | 21-June-2020 |
| 1002 | 1002E | 10-July-2020 |
Behind the scenes, OTBI executes the equivalent SQL:
SELECT
emp.person_number,
asg.assignment_number,
asg.assignment_id,
asg.job_id
FROM
per_all_people_f emp
JOIN per_all_assignments_f asg ON emp.person_id = asg.person_id
AND sysdate BETWEEN emp.effective_start_date AND emp.effective_end_date
AND sysdate BETWEEN asg.effective_start_date AND asg.effective_end_date
;
While automatic joins are helpful for simple relationships, there are cases when explicit joins are required. An example that illustrates both cases is if your report includes the incidents and contacts tables, and you then add a field from the accounts table.
The accounts table can link to the incidents table through three incident fields and can link to the contacts table through one contact field. In this instance, you would be asked if the accounts table should link to incidents or contacts. If you select the incidents table, you will be asked which field in the table should be used as the link.
Tools like BI Publisher or CloudSQL require explicit joins because these layers do not assume automatic relationships, giving you more control but also requiring more attention to join logic. Such flexibility is one of the main strengths of Oracle Fusion joins in advanced reporting.
Must Read: Oracle Fusion Reporting Challenges Explained: Tips, Tools, and Best Practices
Types of Joins & Their Use in Oracle Fusion
Once you understand the basics of SQL joins, the next step is to see how they are applied in Oracle Fusion. Different join types serve different reporting needs, and choosing the right one ensures your results are both accurate and meaningful.
In Fusion, joins help link data across modules such as HCM, Financials, and SCM, allowing you to build reports that reflect real-world business relationships.
Below, we will walk through the main join types, their definitions, and practical examples from Oracle Fusion. The mastery of Oracle Fusion joins is essential to handling such cross-module data effectively.
Inner Joins
An inner join returns only the rows that exist in both tables. For example, joining PER_ALL_PEOPLE_F with PER_ALL_ASSIGNMENTS_F ensures only employees with assignments appear in the results.
SELECT
p.person_id,
p.person_number,
a.assignment_id
FROM
per_all_people_f p
INNER JOIN per_all_assignments_f a ON p.person_id = a.person_id
When to use: Use inner joins when you only want matching records from both tables.
Outer Joins (Left / Right / Full)
Outer joins include unmatched rows. A left join can show all employees even if they don’t have assignments, while a full outer join shows all rows from both tables with NULLs where no match exists.
SELECT
p.person_id,
p.person_number,
a.assignment_id
FROM
per_all_people_f p
LEFT JOIN per_all_assignments_f a ON p.person_id = a.person_id
When to use: Use outer joins when you don’t want to lose rows that don’t have a match in the other table.
Self Joins
A self join connects a table to itself, often used for hierarchies. For example, The PER_JOBS_F table stores job definitions. One of its columns, PROGRESSION_JOB_ID, indicates the next possible job an employee can move into as part of a promotion.
Because both the current job and the progression job are stored in the same table, a self join is required
SELECT
j.job_id AS current_job_id,
j.job_code AS current_job_code,
p.job_id AS progression_job_id,
p.job_code AS progression_job_code
FROM
per_jobs_f j
LEFT JOIN per_jobs_f p ON j.progression_job_id = p.job_id
WHERE
TRUNC (SYSDATE) BETWEEN j.effective_start_date AND j.effective_end_date
AND TRUNC (SYSDATE) BETWEEN p.effective_start_date AND p.effective_end_date
Joins with Views vs Base Tables
In Oracle Fusion, you often have two options when writing SQL: either rely on views (predefined combinations of tables with business logic already applied) or directly join the base tables yourself.
Both approaches have their place; views make queries easier and more consistent, while base tables give you more control and flexibility. The table below highlights the key differences:
| Aspect | Using Views | Using Base Tables |
| Ease of Use | It may be slower for large datasets because views can include extra joins/columns. | Simplifies queries; predefined joins are already built in. |
| Consistency | Ensures standardized joins across reports (less chance of errors). | Flexibility, but risk of inconsistent joins if not carefully applied. |
| Performance | May be slower for large datasets because views can include extra joins/columns. | Can be optimized; only bring in the tables/columns you need. |
| Control | Limited control over join conditions and filters. | Full control over join logic, conditions, and optimizations. |
| When to Use | Best for quick development, ad-hoc reports, or when users are not SQL experts. | Best for performance-sensitive, large, or highly customized reports. |
Also Read: Top Methods to Debug Oracle BI Publisher Error Quickly
Common Table Relationships & Join Patterns in Oracle Fusion
Unlike traditional databases, many Oracle Fusion tables may not have foreign key constraints, which can make identifying joins challenging. Naming conventions are usually a helpful guide.
For example, PERSON_ID in PER_ALL_ASSIGNMENTS_F usually references PERSON_ID in PER_ALL_PEOPLE_F. Common table pairs include:
- Employees and assignments in HCM (PER_ALL_PEOPLE_F ↔ PER_ALL_ASSIGNMENTS_F)
- Invoices and suppliers in Financials (AP_INVOICES_ALL ↔ AP_SUPPLIERS)
- Journal entries and ledgers in GL (GL_JE_LINES ↔ GL_LEDGERS)
Understanding relationship types, such as one-to-many (one employee → many assignments) or many-to-one (many invoices → one supplier), is essential to avoid duplicate data or missing rows.
Identifying Relationships Between Tables
Because foreign keys are often missing, you need alternative ways to find relationships:
- Explore Oracle tables and views documentation for each module.
- Use tools like the CloudSQL Database Browser to inspect metadata easily.
- Reverse-engineer existing SQLs to understand joins. You can find SQLs in many places in Oracle Fusion and outside. Here are a few places.
- BI Publisher data models
- Fusion View Objects
- SQL behind seeded views
- Over the web or AI chatbots (not entirely reliable as of the writing of this blog in 2025, but they definitely can give clues when prompted correctly)
- CloudSQL Online Public SQLs
You Can’t Ignore: Complete Guide to Oracle BI Publisher Performance Tuning for Fusion Applications
Pitfalls & Things to Watch Out For
- Duplicate rows can occur in one-to-many relationships if the joins are not handled correctly.
- Using SELECT * can result in the retrieval of unnecessary columns, which slows down performance.
- Choosing the wrong join type can result in missing data or the introduction of excessive null values.
- Joining too many tables can make the query overly complex and reduce its performance.
- Using join columns that are not indexed can cause queries to run slowly.
- Not using explicit aliases for every column reference can result in ambiguity and errors.
- Not keeping any standards can results in joins and other conditions mixed up leading to difficult to read SQL. It is best practice to place join conditions first, followed by other conditions, to maintain readability and consistency.
- Using a text editor to edit SQLs can become cumbersome without formatting. CloudSQL provides good formatting options that make large SQL statements with many joins easier to read.

Best Practices for Using Joins in Fusion Reports
When creating reports in Oracle Fusion, using joins effectively is crucial for both performance and accuracy. Following best practices ensures that your reports are efficient, maintainable, and deliver the correct insights.
- Clearly map tables and views to business entities before writing joins.
- Use inner joins when you only need matching records from both tables.
- Opt for outer joins when you need to include all records from one table, even if there’s no match in the other.
- Avoid ambiguous joins by specifying clear join conditions with table aliases.
- Alias tables to keep queries readable and avoid confusion.
- Filter data early in the query to reduce the amount of data being joined.
- Monitor performance by checking execution plans and optimizing indexes
Performance Optimization Tips
Efficiently optimizing joins in Oracle Fusion reports is key to maintaining fast and responsive queries. By following best practices, you can significantly reduce load times and improve overall performance
- Index Join Predicates: Ensure that the columns used in join conditions are indexed for faster lookups.
- Limit Retrieved Columns: Only select the columns you need to reduce the data transferred and processed.
- Avoid Excessive Joins: Minimize the number of tables joined at once to prevent complexity and slowdowns.
- Filter Early: Apply filters as early as possible in the query to reduce the data set before joining.
- Optimize Execution Plans: Regularly review and optimize query execution plans to ensure the most efficient path is taken.
You Should Read: Comparison & Guide of Reporting Tools in Oracle Fusion
Join Styles ANSI vs Oracle Syntax
Initially, when relational databases were first developed, the syntax was more rudimentary and often relied on the WHERE clause for both filtering and joining tables. This approach worked well in simpler scenarios but became cumbersome as databases grew more complex.
As SQL standards evolved, the ANSI standard was introduced to provide a more consistent, clear, and readable syntax. The ANSI join style separates the join conditions from the filtering conditions, making it easier to read and maintain, especially when dealing with multiple tables and complex queries.
The traditional Oracle syntax, on the other hand, persisted due to legacy systems and the need for backward compatibility. Over time, as best practices evolved, the ANSI syntax became the standard, and it’s now preferred for new development.
However, the legacy Oracle syntax remains in place for backward compatibility and to support older systems.
In general, the performance differences between ANSI and Oracle (traditional) join syntax are usually minimal. Modern database optimizers are quite sophisticated and can generate similar execution plans regardless of the syntax used.
In other words, the database engine is typically smart enough to optimize the query in a way that doesn’t significantly impact performance.
That said, readability and maintainability are the main benefits of using ANSI syntax. In some cases, older legacy systems might have slight performance differences due to how the queries are structured, but these differences are generally negligible with modern databases.
Ultimately, the choice of syntax often comes down to developer preference, code clarity, and consistency rather than raw performance.
| Aspect | ANSI Syntax | Oracle Syntax |
| Join Keyword | JOIN | Comma-separated tables in the FROM clause with WHERE conditions |
| Join Condition | Specified using the ON keyword | Specified in the WHERE clause |
| Readability | More readable and structured | Can be less readable, especially with multiple tables |
| Legacy Support | Modern and widely used standard | Older syntax, still supported for backward compatibility |
| Complex Joins | Easier to manage multiple joins with clear conditions | Can get complex and harder to read |
| Usage in Fusion | Preferred for new development and clarity | Often found in legacy reports and older code |
Must Read: Complete Guide to Oracle Fusion Custom Report Builder
Frequently Asked Questions (FAQs)
What are the different join types in Oracle Fusion?
In Oracle Fusion, you can use several types of joins, including inner joins, outer joins (left, right, and full), self joins, and cross joins. Each type serves a different purpose depending on the data relationship you want to establish.
When should I use an outer join vs an inner join?
You should use an inner join when you only need records that have matching values in both tables. An outer join is useful when you want to include all records from one table (or both in the case of a full outer join), even if there are no matching rows in the other table.
Can I join tables with more than one relationship in Fusion?
Yes, you can join tables that have more than one relationship in Oracle Fusion. However, you must explicitly define which column or set of columns should be used for the join condition to avoid ambiguity and ensure correct results.
Do joins across many tables slow down reports?
Yes, performance can degrade as the number of joined tables increases because the query becomes more complex. It is important to test queries and optimize them using indexes, filters, and efficient join conditions to maintain good performance.