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.