fulljoin on(...), [columnbinding: expression]*

Performs a temporal full outer join between the primary input and one other dataset: every row from either side appears at least once, with null where there is no counterpart.

You supply an on(…) predicate (or legacy comma-separated equality predicates) that identifies the other dataset, optional name: @other.expr bindings to project additional right-hand columns, and the same temporal rules as other join verbs implemented via join’s shared join logic. A fulljoin is not allowed when exactly one side is an Event and the other is not (Event paired only with Event is supported; mixing Event with Resource, Interval, or Table on the other side is rejected). For table-on-left with Resource or Interval on the right, output valid-time column names may be qualified with the other dataset’s name to avoid collisions.

The resulting dataset kind and timestamp columns follow the join kind rules (for example Resource with Resource stays Resource; Interval with Interval stays Interval). For inner or left outer joins, see join and leftjoin.

Categories

Accelerable

fulljoin is always accelerable if the input is accelerable. A dataset that only uses accelerable verbs can be accelerated, making queries on the dataset respond faster.

Examples

fulljoin on(id=@labels.id), name:@labels.name

Keeps every row from either side, projecting name from @labels while allowing null time or null attributes when one side has no partner.

fulljoin on(host=@inventory.host AND zone=@inventory.zone), sku:@inventory.sku

Uses a compound on predicate so the full outer join matches on two keys before pulling an extra column from the inventory dataset.

fulljoin on(session=@sessions.session_id), device:@sessions.device

Illustrates Event-to-Event fulljoin, which is allowed, unlike pairings where only one side is an Event.