[Inner|Left|Right|Outer] Join / Keep

Join and Keep in Power BI

Qlik joins on all fields with the same name, and a plain Join is a full outer join. Power Query merges need explicit key columns and a join kind. Keep filters a table without merging, which maps to a semi-join filter or an inner merge you don't expand.

Partial / different approach Power Query Modeling

Short answer: For a Join, use Merge queries with the same key and kind (Join = JoinKind.FullOuter, Left Join = LeftOuter). For a Keep, filter with List.Contains. Often the best migration is no join at all: keep the tables separate and relate them.

What it does in Qlik

Join (Orders) LOAD ... merges the new rows into Orders on every common field name. With no prefix it's an outer join. Without a table name it joins to the last loaded table. Left Keep, Inner Keep and similar apply the same matching but keep two separate tables.

Qlik example

Qlik script
Orders: LOAD OrderID, CustomerID, Amount FROM [lib://Data/orders.qvd] (qvd);
Left Join (Orders)
LOAD CustomerID, Segment FROM [lib://Data/customers.qvd] (qvd);

Customers2:
Left Keep (Orders) LOAD CustomerID, Name FROM [lib://Data/customers.qvd] (qvd);

Power BI equivalent

Join (merge + expand)

Power Query M
let
    Merged = Table.NestedJoin(Orders, {"CustomerID"}, Customers, {"CustomerID"}, "C", JoinKind.LeftOuter),
    Result = Table.ExpandTableColumn(Merged, "C", {"Segment"})
in
    Result

Keep (filter only)

Power Query M
let
    Keys   = List.Buffer(List.Distinct(Orders[CustomerID])),
    Result = Table.SelectRows(Customers, each List.Contains(Keys, [CustomerID]))
in
    Result

Gotchas and behaviour differences

  • Implicit keys. Qlik joins on *all* shared names. A forgotten common field such as Date silently becomes part of the key. In Power Query you list the keys, so check which ones the Qlik join actually used.
  • A join with duplicate keys multiplies rows in both tools. Totals go up without any error.
  • Power Query has LeftAnti and RightAnti kinds, which are handy for "not exists" logic. There is no semi-join kind, hence the filter pattern for Keep.

Official documentation

Related pages

Spotted an error or a better pattern? QlikToDax is maintained by a working BI consultant; corrections are welcome via the About page. Last reviewed 2026-10-25.