Mam problemy z próby zrozumienia koncepcji pół dołączenia i jak różni się od konwencjonalnego dołączania. Próbowałem już jakiś artykuł, ale nie był zadowolony z wyjaśnienia, czy ktoś może pomógł mi to zrozumieć?

45
Henu 15 luty 2017, 15:39

2 odpowiedzi

Najlepsza odpowiedź

Prosty przykład. Wybierzmy uczniów z oceną za pomocą lewego zewnętrznego dołączenia:

SELECT DISTINCT s.id
FROM  students s
      LEFT JOIN grades g ON g.student_id = s.id
WHERE g.student_id IS NOT NULL

Teraz to samo z lewym półkowym:

SELECT s.id
FROM  students s
WHERE EXISTS (SELECT 1 FROM grades g
              WHERE g.student_id = s.id)

Ten ostatni jest znacznie bardziej wydajny.

26
Community 6 maj 2018, 07:13

O ile wiem dialekty SQL, które obsługują SEMIJOIN/ANTISEMI są impala U-SQL / Cloudera.

Semijoin:

Semijoins są filtruje wiersz U-SQL w oparciu o włączenie jego wierszy w innym wierszu ) wzór.

Więcej informacji Semi Dołącz i Anty Dołącza powinny mieć własną składnię w SQL :

"Semi" oznacza, że tak naprawdę nie dołączamy do prawej strony, sprawdzamy tylko wtedy, gdy dołączenie przyniesienia wyników dla danej krotki.

-- IN
SELECT *
FROM Employee
WHERE DeptName IN (
  SELECT DeptName
  FROM Dept
)

-- EXISTS
SELECT *
FROM Employee
WHERE EXISTS (
  SELECT 1
  FROM Dept
  WHERE Employee.DeptName = Dept.DeptName
)

EDYTUJ:

Inny dialekt, który obsługuje Semi / Antisemi Dołącz to kql :

Rodzaj = leftsemi (lub miły = dobrzy)

Zwraca wszystkie rekordy z lewej strony, która pasuje do prawej. Tabela wyników zawiera tylko kolumny z lewej strony.

let t1 = datatable(key:long, value:string)  
[1, "a",  
2, "b",
3, "c"];
let t2 = datatable(key:long)
[1,3];
t1 | join kind=leftsemi (t2) on key

demo .

Wynik:

key  value
1    a
3    c
11
Community 20 czerwiec 2020, 09:12