Problem:

Posiadasz rozwiązanie działające w Databricks.

Jak wybrać z tabeli z zamówieniami tylko rekordy, które nie mają przypisanych klientów albo klienci, z jakiegoś powodu nie istnieją. Rozwiązanie zbuduj w oparciu o SQL'a.

Rozwiązanie:

Rozwiązanie pierwsze:

select o.* from d_order o
left join d_customer c on (o.customer_tk = c.customer_tk)
where c.coustomer_tk is null

Albo

select o.* from d_order o
left anti join d_customer c on (o.customer_tk = c.customer_tk)

To są równoznaczne zapytania. Ich rezultatem jest ten sam zbiór danych, różnią się tylko składnią.

Warto zauważyć, że to drugie z użyciem słowa kluczowego anti jest bardziej zwięzłe. Natomiast, gdy ten kod SQL próbujesz migrować na inną platformę, wtedy może nie zadziałać.

Przykład w oparciu o dane

Tabela z zamówieniami:

Tabela z klientami

Left join i użycie składni is null. Czyli wykluczamy te rekordy, które mają powiązanie z tabelą customer

Ten sam wynik da użycie left anti join:

Rekomendacje

To w takim razie gdzie stosować left join i is nul a gdzie użyć left anti join?

Chcesz być zwięzły, użyj left anti join. Twoi koledzy też używają tej składni? Użyj left anti join.

Jeżeli natomiast, nie jest to standard używany w Twoim zespole, wtedy użyj left join i is null. Ten kod może być też łatwiejszy w migracji i stosowaniu na innych środowiskach. Gdybyś musiał się przenieść z Databricks na inną platformę, wtedy migracja jest prostsza.

Jeżeli zapytasz co jest szybsze, left jojn czy left anti join, ja nie zauważyłem różnicy.