How to List Microsoft Access Objects and Navigation Groups with SQL
Question details
The user needs to construct an SQL query to list all Microsoft Access objects alongside their Navigation Pane group information without excluding unassigned objects, and retrieve object descriptions.

- Product
- Microsoft Access
- Device & OS
- not provided
- Scenario
- Writing an SQL query using system tables (MSysObjects) to document or display all database objects, such as tables, queries, forms, reports, and macros, along with their assigned Navigation Groups.
- Observed behavior
- When Navigation Pane group information is added to the MSysObjects query, objects that are not assigned to a Navigation Group disappear from the query results.
Before querying hidden system tables like MSysObjects or MSysNavPaneGroups, ensure that system objects are visible in your Navigation Options and always create a backup copy of your database to prevent accidental data corruption.
Use a LEFT JOIN to Include Unassigned Objects
Replace the INNER JOIN with a LEFT JOIN in your SQL query to ensure that objects without an assigned Navigation Group are still returned in the results.
When you join MSysObjects with MSysNavPaneGroups using a standard INNER JOIN, Access only returns records that have matching entries in both tables. Because some database objects may not be assigned to a custom Navigation Pane group, they are filtered out.
By changing the relationship to a LEFT OUTER JOIN (or simply LEFT JOIN), the query will return all records from the left table (MSysObjects) and only the matched records from the right table (MSysNavPaneGroups). Unassigned objects will show a NULL value for their group instead of being hidden.
Open your Microsoft Access database, navigate to the 'Create' tab on the top ribbon, and click on 'Query Design'.
Close the 'Show Table' dialog if it appears. Right-click the query tab and select 'SQL View' from the context menu.
Locate the FROM clause in your SQL statement. Change the syntax from 'INNER JOIN MSysNavPaneGroups' to 'LEFT JOIN MSysNavPaneGroups ON MSysObjects.Id = MSysNavPaneGroups.ObjectId' (adjusting field names as per your specific schema).
Click the 'Run' button (the red exclamation mark) on the Design tab to execute the query. Verify that all tables, queries, and reports are now listed regardless of their Navigation Pane group assignment.

Retrieve Object Descriptions using DAO
Since Access object descriptions are not always stored directly in standard system tables, use Data Access Objects (DAO) via VBA to retrieve them.
Need a Lightweight Alternative for Daily Office Tasks? Try WPS Office
While Microsoft Access is built for complex relational databases, a vast majority of daily documentation, data analysis, and presentations can be managed much faster with WPS Office. WPS Office is a lightweight, all-in-one suite that perfectly handles Word, Excel, and PowerPoint files.
- 1. Download the Installer: Visit the official WPS Office website and click the free download button for your operating system.
- 2. Install WPS Office: Run the downloaded installer and follow the quick on-screen instructions to set up the software.
- 3. Manage Data Easily: Open WPS Spreadsheet to import your exported database records, and use built-in filters and pivot tables to analyze your data effortlessly.

Frequently Asked Questions
Why are MSysObjects and MSysNavPaneGroups hidden in my database?
Microsoft Access hides system tables by default to protect them from accidental edits or deletions, which could corrupt the database. You can reveal them by right-clicking the top of the Navigation Pane, selecting 'Navigation Options,' and checking 'Show System Objects'.
Can I edit the data directly inside MSysObjects?
No, you should never attempt to manually edit, add, or delete records in system tables like MSysObjects. Modifying these tables directly bypasses Microsoft Access's internal logic and will likely corrupt your database irreparably.
What is the difference between an INNER JOIN and a LEFT JOIN in Access SQL?
An INNER JOIN restricts the query results to only those rows that have matching values in both tables. A LEFT JOIN ensures that all rows from the primary (left) table are displayed, filling in NULL values for the secondary (right) table if no matching relationship exists.




