---
title: "Looker joins with no declared relationship | Metacenta"
description: "A Looker join without `relationship:` defaults to many_to_one, and a one-to-many join then inflates base measures. Why declaring it is worth one line."
url: "https://metacenta.com/rules/lookml-join-no-relationship"
updated: "2026-10-14"
tokens: 541
---

BI semantic layer · rule lookml-join-no-relationship

# Looker joins with no declared relationship

A Metacenta review checks this under the rule **A join declares its relationship**. Everything below applies whether or not you ever commission one.

## What this rule checks

This rule flags every join in an explore that doesn't declare `relationship:`. A refinement that adds it counts. Joins inherited from an explore that wasn't supplied can't be seen, so they're not counted.

## Why it matters

Looker assumes `many_to_one` when a join doesn't say. If the join is really one-to-many, Looker doesn't know the rows fan out. Measures from the base view can then be counted once per joined row.

## How to fix it

**Declare the relationship on every Looker join.** Declare `relationship:` on each join as a decision rather than a default: `many_to_one`, `one_to_many`, `one_to_one` or `many_to_many`.

Before:

```lookml
explore: orders {
  join: order_items {
    sql_on: ${orders.order_id} = ${order_items.order_id} ;;
  }
}
```

After:

```lookml
explore: orders {
  join: order_items {
    relationship: one_to_many
    sql_on: ${orders.order_id} = ${order_items.order_id} ;;
  }
}
```

## When it is fine to leave

Very little. Where `many_to_one` is genuinely right the default does no harm today, but nobody can tell a decision from an oversight. Write it down; it is one line.

## What we need to check it

The `.lkml` files alone.

[Ask about a review](https://metacenta.com/enquire?src=rule-lookml-join-no-relationship&via=md)

## Related pages

- [dbt semantic models reading unbuilt columns](https://metacenta.com/rules/semantic-column-not-built)
- [dbt semantic model keys with no unique test](https://metacenta.com/rules/semantic-primary-entity-unasserted)
- [Looker views reading tables dbt does not know](https://metacenta.com/rules/lookml-view-unbuilt-table)
- [Looker views reading raw dbt sources](https://metacenta.com/rules/lookml-view-reads-raw-source)
- [A sample review, as a client reads it](https://metacenta.com/sample)
- [All published rules](https://metacenta.com/rules)
- [How a review is assessed](https://metacenta.com/standard)
