What is OBIEE Federation?
OBIEE federation is the ability to query across multiple subject areas or data sources as if they were a single unified data model. Instead of writing separate queries for each subject area and stitching results together, federation lets you write one logical SQL statement that transparently joins data from different business areas.
Federation in OBIEE On-Prem vs. OTBI Cloud
| Feature | OBIEE On-Prem | OTBI Cloud |
|---|---|---|
| Multi-subject area joins | ✓ Supported (RPD-managed) | ✗ Not available |
| RPD modification | ✓ Full access | ✗ Read-only Oracle-managed |
| VPD & virtual database layers | ✓ Available | ✗ No equivalent |
| Conformed dimensions | ✓ Manual configuration | ✓ Pre-configured by Oracle |
| Workaround: BI Publisher data models | Optional | ✓ Recommended |
The key difference: In OBIEE on-prem, you control the RPD (Repository) and can explicitly define how subject areas relate to each other. In OTBI cloud, Oracle maintains the RPD and doesn't expose federation capabilities—you must use alternative approaches.
Common Federation Conflict Errors
Error 1: nQSError 27002 — Syntax Error in Logical SQL
nQSError: 27002: Syntax error in Logical SQL: syntax error [nQSError: 43113: Error while parsing the query. [nQSError: 27002: Syntax error in Logical SQL: ... ]]
Cause: Attempting to comma-join two subject areas in OTBI logical SQL, or an undefined table alias in the ON clause.
Example (wrong):
SELECT
Workforce."Workforce"."Employee Number",
Absence."Absence"."Absence Reason"
FROM Workforce, Absence
WHERE Workforce."Workforce"."Employee Number" = Absence."Absence"."Employee Number"
OTBI doesn't allow direct subject area joins like this—each subject area is isolated in the logical layer.
Error 2: nQSError 14025 — No Fact Table at Requested Level
nQSError: 14025: There is no fact table that has granularity defined at the requested level.
Cause: Mixing fact tables with different granularities. For example, combining a "Worker" level measure with an "Assignment" level measure, when the fact tables don't align on the same dimension keys.
Example:
- Workforce subject area has
PER_ALL_PEOPLE_F(Worker grain) - Assignment subject area has
PER_ALL_ASSIGNMENTS_M(Assignment grain) - If you request both "Headcount" (worker level) and "Total Compensation" (assignment level) without proper dimensional alignment, the RPD can't find a fact table at the intersection
Error 3: nQSError 22024 — Column Not Found
nQSError: 22024: Column not found [Column Name]
Cause: Referencing a column that exists in Subject Area B, but your FROM clause only includes Subject Area A (or the column name is ambiguous across multiple subject areas).
Example:
SELECT
p."Person"."Person Number",
a."Assignment"."Assignment Number"
FROM "Compensation"."Compensation Details" p
WHERE a."Assignment"."Full Time Equivalent" = 1
Alias a (Assignment) is referenced in the WHERE clause but never appears in the FROM clause.
OBIEE On-Prem Federation Solutions
If you run OBIEE on-prem (self-managed), you have direct control over the RPD and can implement federation in three ways:
1. Virtual Private Databases (VPD) in the RPD Physical Layer
VPD allows you to query multiple physical tables as if they were one logical table. In the RPD:
- Create a logical table that combines columns from multiple physical tables
- Define row-wise security rules that determine which physical table provides data based on context (user, organization, date)
- Users see one unified logical table; the RPD routes queries to the appropriate physical table at runtime
Use case: Querying Employee data from different legal entities or payroll systems that are structured identically but stored separately.
2. Cross-Database Joins in the RPD
If your subject areas source from different databases (e.g., HCM schema + Payroll schema), you can configure cross-database joins in the RPD's physical layer:
- Ensure both databases are registered in the Connection Pool
- Create a physical join between tables across databases using a shared key (e.g.,
PER_ALL_PEOPLE_F.PERSON_ID=PAY_PEOPLE.PERSON_ID) - The RPD will automatically route the query to both databases and perform the join in the BI server
Gotcha: Cross-database joins require the connection pool to support distributed queries. Test throughput and latency—joining across databases can be slow.
3. Conformed Dimensions in the Logical Layer
Conformed dimensions are shared logical dimensions that multiple subject areas reference. This is the cleanest federation approach:
- Create a logical dimension table (e.g., "Person") that multiple logical fact tables can join to
- In the logical layer, use logical joins to connect fact tables through the shared dimension
- When a user queries across subject areas, the RPD intelligently joins through the conformed dimension
Example: Both "Workforce" and "Absence" subject areas join through a conformed "Person" dimension. A query for "Employees with Active Absences" automatically joins through Person.
RPD Consistency Check
After defining federation rules, always run Tools → Check Global Consistency in the RPD client. This validates:
- Logical joins have valid physical joins backing them
- All referenced columns exist
- No circular dependencies in dimensions
- Foreign key cardinality is correct (1:N, not 1:M ambiguity)
OTBI Cloud Workarounds
Since OTBI cloud doesn't expose federation (Oracle maintains the RPD as read-only), you must use alternative approaches to combine data from multiple subject areas:
Method 1: BI Publisher Data Model (Recommended)
Use BI Publisher to create a custom data model that combines logical SQL queries from multiple subject areas, linked by common keys (Person Number, Assignment Number, etc.).
Steps:
- In BI Publisher, create a SQL Query that fetches Workforce data (filtered to needed columns)
- Create a second SQL Query for Absence data
- Link the two queries using a Data Link on
PERSON_ID - Run a test report; BI Publisher will join the results in the application layer
-- Query 1: Workforce (Primary Query)
SELECT
ppf.PERSON_ID,
ppf.PERSON_NUMBER,
ppf.FIRST_NAME,
ppf.LAST_NAME
FROM PER_ALL_PEOPLE_F ppf
WHERE TRUNC(SYSDATE) BETWEEN ppf.EFFECTIVE_START_DATE
AND ppf.EFFECTIVE_END_DATE
ORDER BY ppf.PERSON_ID;
-- Query 2: Absence (Linked Query)
SELECT
pab.PERSON_ID,
pab.ABSENCE_ID,
pab.ABSENCE_TYPE_ID,
plc.LOOKUP_CODE as ABSENCE_REASON,
pab.START_DATE,
pab.END_DATE
FROM PER_ABSENCE_ENTRIES pab
LEFT JOIN PER_LOOKUPS plc
ON pab.ABSENCE_TYPE_ID = plc.LOOKUP_TYPE
AND plc.LOOKUP_TYPE = 'ABSENCE_TYPE'
WHERE TRUNC(SYSDATE) BETWEEN pab.EFFECTIVE_START_DATE
AND pab.EFFECTIVE_END_DATE
ORDER BY pab.PERSON_ID;
-- Data Link: Query 1.PERSON_ID = Query 2.PERSON_ID
Pros:
- Full control over query logic and join behavior
- Works with any OTBI subject area
- Can use raw SQL with date-effective filters optimized for your use case
Cons:
- Requires BI Publisher license
- Application-layer join (slower for large result sets)
- Need to maintain data links if schema changes
Method 2: Find a Pre-Built Combined Subject Area
Oracle often provides combined subject areas that already join commonly-needed data sources. Before building a custom data model, check if Oracle has created a pre-built subject area:
- Workforce + Absence: "Absence Management" or "Employee Absence Details" subject area (may include absence reasons, accruals, and employee data)
- Workforce + Compensation: "Workforce + Compensation" or "Total Rewards" subject area
- Assignment + Payroll: "Payroll Integration" or "Assignment Payroll" subject area
To discover available subject areas:
- Open OTBI (BI Answer or OTBI home)
- Click New → Logical SQL
- In the query builder, browse the Subject Area dropdown — all available subject areas are listed with counts of available columns
- Search for keywords like "Absence", "Compensation", "Total Rewards" in the dropdown
Method 3: Oracle Analytics Cloud (OAC) Semantic Modeler
If you have Oracle Analytics Cloud (OAC), you can use the Semantic Modeler to define custom business models that span multiple OTBI subject areas, with cross-SA joins.
Steps:
- In OAC, create a new Business Model
- Add tables from multiple OTBI subject areas as data sources
- Define relationships between tables using logical join expressions
- Publish as a new subject area for Answers or OTBI
Use case: You need true federation across multiple OTBI subject areas without rebuilding queries each time.
Caveat: OAC Semantic Modeler is a separate product with separate licensing. Check your Oracle contract.
Scenario: Combining Workforce + Absence Data
A common federation use case: "Show me all employees with their active absences, grouped by absence reason."
The Wrong Way (Will Fail in OTBI)
Direct Subject Area Join (OTBI Logical SQL)
Will fail with nQSError 27002 or 43113
SELECT
w."Worker".PERSON_NUMBER,
w."Worker".FIRST_NAME,
a."Absence".ABSENCE_REASON,
COUNT(*) as ABSENCE_COUNT
FROM "Workforce"."Worker" w, "Absence"."Absence Details" a
WHERE w."Worker".PERSON_ID = a."Absence Details".PERSON_ID
AND TRUNC(SYSDATE) BETWEEN a."Absence Details".START_DATE
AND a."Absence Details".END_DATE
GROUP BY w."Worker".PERSON_NUMBER, w."Worker".FIRST_NAME,
a."Absence".ABSENCE_REASON;
The Right Way (BI Publisher Data Model)
BI Publisher Approach
Query 1 (Primary): Fetch active workforce
SELECT
ppf.PERSON_ID,
ppf.PERSON_NUMBER,
ppf.FIRST_NAME,
ppf.LAST_NAME,
ppf.EMPLOYEE_NUMBER
FROM PER_ALL_PEOPLE_F ppf
WHERE ppf.PERSON_TYPE_ID IN (
SELECT person_type_id
FROM PER_PERSON_TYPES
WHERE system_person_type = 'EMP'
)
AND TRUNC(SYSDATE) BETWEEN ppf.EFFECTIVE_START_DATE
AND ppf.EFFECTIVE_END_DATE
ORDER BY ppf.PERSON_NUMBER;
Query 2 (Linked): Fetch active absences
SELECT
pab.PERSON_ID,
pab.ABSENCE_ENTRY_ID,
plc.MEANING as ABSENCE_REASON,
pab.START_DATE,
pab.END_DATE,
(pab.END_DATE - pab.START_DATE + 1) as DAYS_ABSENT
FROM PER_ABSENCE_ENTRIES pab
LEFT JOIN PER_LOOKUPS plc
ON pab.ABSENCE_TYPE_ID = plc.LOOKUP_TYPE
AND plc.LOOKUP_TYPE = 'ABSENCE_TYPE'
WHERE TRUNC(SYSDATE) BETWEEN pab.EFFECTIVE_START_DATE
AND pab.EFFECTIVE_END_DATE
ORDER BY pab.PERSON_ID, pab.START_DATE;
Data Link: Query 1.PERSON_ID = Query 2.PERSON_ID
BI Publisher Layout: For each Person (Query 1), print Absence records (Query 2) in a details section.
Scenario: Combining Compensation + Assignment Data
Another federation scenario: "Show me all assignments with their salary bands and compensation history."
The Challenge
Compensation subject area (PAY_ schema) and Assignment subject area (PER_ALL_ASSIGNMENTS_M) are at different grains:
- Assignment is 1 record per {PERSON_ID, ASSIGNMENT_ID, EFFECTIVE_DATE}
- Compensation may be 1 record per {PERSON_ID, GRADE_ID, EFFECTIVE_DATE} or per {PERSON_ID, PAYROLL_ID, EFFECTIVE_DATE}
Direct join can produce duplicates or missing rows.
Solution: Use Conformed Join Keys
BI Publisher with Conformed Dimensions
Join through PERSON_ID and EFFECTIVE_DATE:
SELECT
pam.ASSIGNMENT_ID,
pam.PERSON_ID,
pam.EFFECTIVE_START_DATE as ASSIGN_START,
pam.EFFECTIVE_END_DATE as ASSIGN_END,
pcs.GRADE_ID,
pcs.GRADE_NAME,
pcs.MIN_SALARY,
pcs.MAX_SALARY,
pcs.MIDPOINT_SALARY,
ppf.PERSON_NUMBER,
ppf.FIRST_NAME || ' ' || ppf.LAST_NAME as FULL_NAME
FROM PER_ALL_ASSIGNMENTS_M pam
LEFT JOIN PER_ALL_PEOPLE_F ppf
ON pam.PERSON_ID = ppf.PERSON_ID
AND TRUNC(SYSDATE) BETWEEN ppf.EFFECTIVE_START_DATE
AND ppf.EFFECTIVE_END_DATE
LEFT JOIN PER_COMP_SALARY pcs
ON pam.GRADE_ID = pcs.GRADE_ID
AND TRUNC(SYSDATE) BETWEEN pcs.EFFECTIVE_START_DATE
AND pcs.EFFECTIVE_END_DATE
WHERE TRUNC(SYSDATE) BETWEEN pam.EFFECTIVE_START_DATE
AND pam.EFFECTIVE_END_DATE
ORDER BY ppf.PERSON_NUMBER, pam.ASSIGNMENT_ID;
Key technique: Use LEFT JOIN with date-effective filters on all tables. This ensures you get all assignments, even if salary data is missing (null-safe).
Identifying Which Subject Area Contains a Column
When building federated queries, you need to know which subject area has a specific column. Use this workflow in OTBI:
- Open OTBI Answers (or go to BI Answer home)
- Click New → Logical SQL
- In the query builder, click on the Subject Area dropdown
- Start typing the column name or keyword (e.g., "Absence Reason")
- OTBI will filter subject areas that contain matching columns
- Expand each subject area to see the full column list
Alternative: Browse via Column List
- Open a subject area in the query builder
- Expand "Column Definitions" (usually on the left panel)
- Scroll through all available columns in that subject area
- If not found, switch to a different subject area and repeat
Grain Conflict Detection
Grain conflicts occur when you mix measures from fact tables with different dimensional granularities, causing inaccurate aggregates or "no fact table at requested level" errors.
Example: Worker vs. Assignment Grain
| Measure | Source Table | Grain | Can Mix? |
|---|---|---|---|
| Headcount | PER_ALL_PEOPLE_F | 1 row per Worker | No |
| Assignments (count) | PER_ALL_ASSIGNMENTS_M | 1 row per Assignment | No |
| FTE (Full Time Equivalent) | PER_ALL_ASSIGNMENTS_M | 1 row per Assignment | Yes (same as assignments) |
| Salary | PAY_ tables | Often per Payroll ID | Maybe (depends on join) |
How to Avoid Grain Conflicts
Rule 1: Identify the grain of each measure
- Headcount (Person grain) cannot be mixed with FTE (Assignment grain) without causing double-counts
- Always ask: "What is the lowest level of detail in this metric?"
Rule 2: Aggregate consistently
- If mixing grains, aggregate to the coarsest grain explicitly in your query
- Example: If mixing Person and Assignment grains, group by PERSON_ID only, and use SUM(FTE) to aggregate assignments per person
Rule 3: Use conformed dimensions
- In a properly federated query, all measures should roll up through the same dimensions (Person → Department → Company)
- If a measure breaks this hierarchy, it may indicate a grain conflict
RPD Consistency Checks (On-Prem Only)
For OBIEE on-prem deployments with custom federation rules, always run consistency checks:
Using the RPD Client
- Open Oracle BI Administration Tool
- Connect to your RPD repository
- Go to Tools → Check Global Consistency
- A detailed report will show:
- Broken logical joins (physical joins not found)
- Orphaned logical tables (not in any subject area)
- Unresolved foreign keys
- Circular join paths
- Ambiguous dimensions (multiple paths to same table)
Common Consistency Errors
"Physical Table Not Found" Error
Cause: A logical join references a physical table that was deleted or renamed.
Fix:
- In the RPD, open the logical layer
- Find the broken logical join (indicated in the consistency check)
- Re-map it to the correct physical table in the physical layer
- Re-run consistency check
"Ambiguous Dimension" Error
Cause: Multiple tables can reach the same dimension through different paths, making the join order ambiguous.
Fix:
- Examine the join graph in the logical layer
- Designate one path as the "canonical" path
- Set join properties: Cardinality (1:N, 1:1), Join Type (inner, left outer)
- Use Logical Join Properties → Advanced to set join order hints if needed
Quick Reference: Federation Approach by Scenario
| Scenario | Subject Areas | OBIEE On-Prem | OTBI Cloud |
|---|---|---|---|
| Combine Workforce + Absence | 2 separate | Conformed Dimension (Person) | BI Publisher Data Model + Data Link |
| Combine Assignment + Compensation | 2 separate | Cross-DB join on PERSON_ID + GRADE_ID | BI Publisher + date-effective LEFT JOIN |
| Combine Payroll + Assignment | 2 separate | Cross-DB join on PERSON_ID + PAYROLL_ID | Check for pre-built "Payroll Integration" SA |
| Multiple legal entities, same schema | 1 logical, multiple physical | VPD (Virtual Private Database) | Row-level security + BI Publisher filters |
| Complex cross-SA relationships | 3+ separate | Conformed Dims + RPD consistency checks | OAC Semantic Modeler (if available) |
Frequently Asked Questions
Short answer: No. OBIEE on-prem federation happens in the RPD (Repository), which you control. In OTBI cloud, Oracle manages the RPD as read-only. You cannot define custom federation rules in OTBI.
What you can do instead: Use BI Publisher data models (Method 1), find pre-built combined subject areas (Method 2), or use OAC Semantic Modeler (Method 3).
BI Publisher data models (application-layer joins): Slower for large result sets. BI Publisher fetches data from both queries separately, then joins in memory. Works well for reports with < 100K rows total.
True RPD federation (database-layer joins): Faster. The database joins the data before returning results. Can handle millions of rows efficiently.
When to use each: Use BI Publisher for ad-hoc reports and smaller datasets. If you need daily federation queries on millions of rows, consider migrating to OBIEE on-prem or using OAC Semantic Modeler.
Symptom 1: "No fact table at requested level" error → You've mixed measures from different grains without proper aggregation.
Symptom 2: Results don't match your expectations (e.g., headcount is 200 but should be 150) → Likely a grain conflict causing duplicates.
How to diagnose:
- Identify the grain of each measure in your query (Worker? Assignment? Payroll?)
- Check if they align (all worker-level? all assignment-level?)
- If mixed, examine the GROUP BY clause—are you aggregating to a common grain?
- Count rows at each grain level manually in a simple query to verify expectations
OTBI cloud advantages: No maintenance, automatic updates, pre-built subject areas, integrated with Fusion HCM.
OTBI cloud disadvantages: No federation, limited RPD customization, higher licensing costs if you need multiple instances.
OBIEE on-prem advantages: Full RPD control, true federation, lower licensing (single perpetual license), can integrate with non-Oracle data sources.
OBIEE on-prem disadvantages: Maintenance overhead, no automatic updates, RPD expertise required.
Recommendation: If you heavily use federation, stay on-prem. If you can work with BI Publisher data models, OTBI cloud is simpler. Consider a hybrid: OTBI for standard reports, OAC Semantic Modeler for federation needs.
Need Help Debugging OBIEE Errors?
Use our SQL validator to test Logical SQL queries and diagnose nQSError issues instantly.
Try the SQL Validator →OTBI Template Pack
Get 15 ready-to-use OTBI templates, including federated data model examples for Workforce + Absence and Assignment + Compensation.
Explore Templates →